ios - 使用 JSON 响应调用 swift 中的函数时出错

标签 ios json swift alamofire

其他人可以帮助我知道在 swift 中调用函数并接收 JSON 集合响应的方法是什么吗? 我在 viewController.swift 中调用 ApiClient().getList() 函数,该函数调用我的 API 并在 apiClient.swift 中接收 JSON 响应,最后我想将此 JSON 响应分配给 viewController 中的 self.result 变量。 swift 。

我的代码是:

viewController.swift

import UIKit


class ClubsViewController: UIViewController, UITableViewDataSource{

    var results: [JSON]? = []

    @IBOutlet var tableview:UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()
        self.loadClubsObjects()
    }

    func loadClubsObjects(){

        self.results = ApiClient().getList() <--- here is the call
        self.tableview.reloadData()

    }
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.results?.count ?? 0
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        var cell = tableView.dequeueReusableCellWithIdentifier("clubsObjectCell") as! ClubsTableViewCell
        cell.clubsObject = self.results?[indexPath.row]
        return cell
    }
}

ApiClient.swift

import Foundation
import Alamofire

class ApiClient {

     func getList() -> [JSON] {

            var URL = NSURL(string: "https://api.com/v1/clubs")
            var mutableURLRequest = NSMutableURLRequest(URL: URL!)
            mutableURLRequest.setValue("Content-Type", forHTTPHeaderField: "application/json")
            mutableURLRequest.HTTPMethod = "GET"
            mutableURLRequest.setValue("Bearer R01.iNsG3xjv/r1LDkhkGOANPv53xqUFDkPM0en5LIDxx875fBjdUZLn1jtUlKVJqVjsNwDe1Oqu2WuzjpaYbiWWhw==", forHTTPHeaderField: "Authorization")
            let manager = Alamofire.Manager.sharedInstance
            let request = manager.request(mutableURLRequest)
            request.responseJSON { (request, response, json, error) in

                if (json != nil){
                  var jsonObj = JSON(json!)
                  if let data = jsonObj["hits"].arrayValue as [JSON]?{
                    return data

                  }
                }
            }
     }

apiClient.swift 中的错误是

返回数据 -> [JSON] 无法转换为 Void

最佳答案

getList 的定义方式应该返回 [JSON] 对象。但它不能这样做,因为 responseJSON 是一个异步方法(即 responseJSON 的完成闭包直到您从 getList 返回后才被调用>)。

您必须采用自己的 completionHandler 模式。例如,getList 不会返回任何内容,,而是需要一个完成处理程序参数:

func getList(completionHandler: ([JSON]) -> ()) {
    let URL = NSURL(string: "https://api.com/v1/clubs")
    let mutableURLRequest = NSMutableURLRequest(URL: URL!)

    mutableURLRequest.setValue("Content-Type", forHTTPHeaderField: "application/json")
    mutableURLRequest.HTTPMethod = "GET"
    mutableURLRequest.setValue("Bearer R01.iNsG3xjv/r1LDkhkGOANPv53xqUFDkPM0en5LIDxx875fBjdUZLn1jtUlKVJqVjsNwDe1Oqu2WuzjpaYbiWWhw==", forHTTPHeaderField: "Authorization")

    let manager = Alamofire.Manager.sharedInstance
    let request = manager.request(mutableURLRequest)

    request.responseJSON { response in
        if let json = response.result.value  {
            var jsonObj = JSON(json)
            if let hits = jsonObj["hits"].arrayValue as [JSON]? {
                completionHandler(hits)
            }
        }
    }
}

你可以这样调用它:

let apiClient = ApiClient()

func loadClubsObjects() {
    apiClient.getList() { hits in
        // use hits here

        self.results = hits
        self.tableView.reloadData()
    }

    // but not here
}

请注意,我倾向于不将 API client 设置为 loadClubsObjects 的局部变量,而是将其设置为如上所示的类属性。做任何你想做的事,但我觉得这是一个更合乎逻辑的生命周期。


如果您想处理错误,您可以更改完成处理程序闭包,以便 (a) JSON 命中数组是可选的; (b) 添加一个可选的错误对象。然后更改 getList 以传回这些可选值:

func getList(completionHandler: ([JSON]?, NSError?) -> ()) {
    let URL = NSURL(string: "https://api.com/v1/clubs")
    let mutableURLRequest = NSMutableURLRequest(URL: URL!)

    mutableURLRequest.setValue("Content-Type", forHTTPHeaderField: "application/json")
    mutableURLRequest.HTTPMethod = "GET"
    mutableURLRequest.setValue("Bearer R01.iNsG3xjv/r1LDkhkGOANPv53xqUFDkPM0en5LIDxx875fBjdUZLn1jtUlKVJqVjsNwDe1Oqu2WuzjpaYbiWWhw==", forHTTPHeaderField: "Authorization")

    let manager = Alamofire.Manager.sharedInstance
    let request = manager.request(mutableURLRequest)

    request.responseJSON { response in
        if let json = response.result.value {
            var jsonObj = JSON(json)
            if let hits = jsonObj["hits"].arrayValue as [JSON]? {
                completionHandler(hits, nil)
            } else {
                let jsonError = NSError(domain: "mydomain", code: MyErrorCode.HitsNotFound, userInfo: nil) // create whatever sort of error object you think is appropriate if `hits` was not found
                completionHandler(nil, jsonError)
            }
        } else {
            completionHandler(nil, response.result.error)
        }
    }
}

然后,当您调用它时,您可以检查 JSON 对象数组是否为 nil ,如果为 nil,则查看 NSError 对象。

关于ios - 使用 JSON 响应调用 swift 中的函数时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29881701/

相关文章:

ios - UIBarButtonItem 色调颜色不起作用

swift - UITextView 长度问题

iphone - 如何使手势识别器在动画 UIImage View 中工作

iphone - 动画火柴人

iphone - 第二个 View Controller 中的 UIButton - Touch Up Inside 不起作用(Touch Down 确实如此)

javascript - Chrome 扩展程序 - 单击扩展程序、新选项卡和重定向

javascript - 从 Spring MVC 方法传递 JSON 数据时,JSON 输入意外结束

javascript - 将外部 JSON URL 标签和值拉入新数组

ios - 使用 RxSwift 和 Moya 处理重新认证

swift - "Cannot assign value of type ' 字符串 ' to type ' AnyObject? '", swift 3,Xcode 8 测试版 6