【问题标题】:Swift 3 using AFNetworking使用 AFNetworking 的 Swift 3
【发布时间】:2016-12-09 06:53:28
【问题描述】:

我正在将 AFNetworking 与 Swift 3.0 一起使用,但我被困在一个代码上。

func getJSON()
    {


        let manager = AFHTTPSessionManager()
        manager.get(
            url,
            parameters: nil,
            success:
            {
                (operation: URLSessionTask!, responseObject: Any?) in

                 print("JSON: " + responseObject!.description)
                 self.matchesArray = responseObject!.object(forKey: "matches")! as? NSMutableArray
                 self.tollBothPlazaTableView.reloadData()
            },

            failure:
            {
                (operation: URLSessionTask!, error: NSError)  in
                print("Error: " + error.localizedDescription)
            }
        )
    }

它在failure 块上显示错误。

无法将类型 '(URLSessionTask!, NSError) -> ()' 的值转换为预期的参数类型 '((URLSessionDataTask?, Error) -> Void)?'`

谁能解释我的代码有什么问题。还有使用闭包的正确方法吗? (我是 swift 新手)。

【问题讨论】:

    标签: ios swift swift3 afnetworking


    【解决方案1】:

    错误清楚地表明使用Error 而不是NSError,在Swift 3 中你需要使用Error 而不是NSError。所以改变你的代码如下。

    func getJSON() {
    
        let manager = AFHTTPSessionManager()
        manager.get(
            url,
            parameters: nil,
            success:
            {
                (operation, responseObject) in
    
                 if let dic = responseObject as? [String: Any], let matches = dic["matches"] as? [[String: Any]] {
                      print(matches)
                 }
                 DispatchQueue.main.async {                          
                     self.tollBothPlazaTableView.reloadData()
                 }
            },
            failure:
            {
                (operation, error) in
                 print("Error: " + error.localizedDescription)
        })
    }
    

    注意:当你在后台线程上时,总是在主线程上执行 UI 更改,所以像我一样在主线程上重新加载你的 tableView,同时使用 Swift 本机 ArrayDictionary 而不是 NSArrayNSDictionary

    【讨论】:

    • 谢谢。这解决了它。那么我应该将我的数组声明为 Array 而不是 NSMutableArray 吗?
    • @thewarri0r9 欢迎朋友,如果它包含像var matchesArray = [[String:Any]]() 这样的字典,则将您的数组声明为字典数组,就像我的答案一样,如果它包含像var matchesArray = [String]() 这样的字符串,则将其声明为字符串数组
    【解决方案2】:

    **最好在swift 3中使用Alamofire(同一个开发者)**

    func jsonRequest()
    {
    
        let url =  "url"
        //if you want to add paramter
        parametr = ["username" : "user" , "password"]
    
    
        Alamofire.request(url, method: .post, parameters: nil, encoding: JSONEncoding.default)
            .responseJSON { response in
                // print(response)
                //to get status code
                if let status = response.response?.statusCode {
                    switch(status){
                    case 201:
                        print("example success")
                    default:
                        print("error with response status: \(status)")
                    }
                }
    
                //to get JSON return value
                if let array = response.result.value as? //NSDictionary [[String : Any]]
                {
    
    
                }
        }
    
    }
    

    【讨论】:

    • 好的没问题,但试试 Alamofire 比 Afnetworing 更好 :-) 快乐编码
    • 但如果你有一个混合项目,并不总是需要两个框架来做同样的事情。 AlamoFire 更好,我们在仅 Swift/大部分项目中使用它——但如果你有 90% 的 ObjC——它就是不实用。
    猜你喜欢
    • 1970-01-01
    • 2014-07-26
    • 1970-01-01
    • 2017-10-27
    • 2016-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多