调用函数的错误 swift 与 JSON 响应

发布时间: 2017/3/5 1:35:11
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

别人能帮我知道这是方法调用中的函数 swift ,接收 JSON 收集响应? 我打电话的 ApiClient().getList() 定义的 viewController.swift,this 函数调用到我的 API 和接收 JSON 响应在 apiClient.swift 和最后想要分配给 self.result 变量在 viewController.swift 这个 JSON 响应。

我的代码是︰

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] >返回的数据是不可兑换到虚空

解决方法 1:

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 客户端的本地变量 loadClubsObjects ,但相当的如上所示的类属性。无论你想做,但它在我看来更符合逻辑的生命周期。


如果你想要处理的错误,你可能会改变完成处理程序关闭这样 (a) JSON 命中数组是可选的; 和 (b) 添加一个可选的 error 对象。然后更改 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 对象。

官方微信
官方QQ群
31647020