使用 AFNetworking 的 Swift 3

Posted

技术标签:

【中文标题】使用 AFNetworking 的 Swift 3【英文标题】:Swift 3 using AFNetworking 【发布时间】: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 新手)。

【问题讨论】:

【参考方案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——它就是不实用。

以上是关于使用 AFNetworking 的 Swift 3的主要内容,如果未能解决你的问题,请参考以下文章

Swift:在 AFNetworking 调用中关闭的未包装选项

swift 中使用OC第三方库(以AFNetworking为例)

在 Swift 中使用 AFNetworking 接收响应

如何在Swift 中使用AFNetworking

在swift ios中使用AFNetworking上传图片

如何查看 AFNetworking 的 Swift API?