【问题标题】:AFNetwoking with swift 3.0 & xcode 8 : POST Request & GET Request使用 swift 3.0 和 xcode 8 的 AFNetworking:POST 请求和 GET 请求
【发布时间】:2017-01-31 02:09:16
【问题描述】:

我正在尝试使用 AFNetworking & swift 3.0 和 xcode 8.0 解析数据,但出现如下错误。以下代码适用于 swift 2.3,但不适用于 3.0

或者,如果有人知道使用 xcode 8.0 进行 POST 和 GET 请求的 AFNetworking 和 swift 3.0,请告诉我。用简单的例子。 提前致谢

你可以看到下面的错误。

 func callApi(apiName: String, param: [String : AnyObject]?, data: NSDictionary?, withMethod type: String, CompletionHandler:@escaping (_ code: Int, _ error:NSError?, _ response:AnyObject?) -> Void)

    {

        MBProgressHUD.showAdded(to: AppDelegateObj.window, animated: true)
        let str_URL : String = kHOSTPATH+apiName

        let manager: AFHTTPSessionManager = AFHTTPSessionManager()

        if (type == kREQ_POST) {

            manager.POST(str_URL, parameters: param, constructingBodyWithBlock: { (formData: AFMultipartFormData!) in

                if data?.allValues.count != 0 && data != nil
                {

                    let fileUrl = NSURL(fileURLWithPath: (data?.valueForKey("filePath"))! as! String)
                    try! formData.appendPartWithFileURL(fileUrl, name: (data?.valueForKey("key"))! as! String)
                }

                }, progress: { (NSProgress) in

                }, success: { (task:URLSessionDataTask, responseObject) -> Void in

                    CompletionHandler(code: 1, error: nil, response:responseObject)
                    MBProgressHUD.hideHUDForView(AppDelegateObj.window, animated: true)

                }, failure: { (task:URLSessionDataTask?, error:NSError) -> Void in

                    CompletionHandler(code: 0, error: error, response:nil)
                    MBProgressHUD.hideHUDForView(AppDelegateObj.window, animated: true)
            })
        }
        else {

            manager.GET(str_URL, parameters: param, progress: { (NSProgress) in

                }, success: { (task:URLSessionDataTask, responseObject) -> Void  in

                    CompletionHandler(code: 1, error: nil, response:responseObject)
                    MBProgressHUD.hideHUDForView(AppDelegateObj.window, animated: true)

                }, failure: { (task:URLSessionDataTask?, error:NSError) -> Void  in

                    CompletionHandler(code: 0, error: error, response:nil)
                    MBProgressHUD.hideHUDForView(AppDelegateObj.window, animated: true)
            })
        }
    }

但我遇到了这样的错误

cannot convert the value of type (URLSessionDataTask?,NSError)->Void to expected argument type '((URLSessionDataTask?,NSError)->Void)?'

【问题讨论】:

标签: post get swift3 xcode8


【解决方案1】:

将错误类型从 NSERROR 更改为 ERROR。类型兼容性从 Swift2.3 更改为 Swift 3.0

【讨论】:

    【解决方案2】:

    试试这个:

    func Get()
    {
        let url = NSURL(string: Webserive.UserProfileInfoList + "/" + String(300))
        let request = NSURLRequest(url: url! as URL)
    
        NSURLConnection.sendAsynchronousRequest(request as URLRequest, queue: OperationQueue.main) {(response, data, error) in
            self.GetData(data: data! as NSData)
        }
    }
    
    func GetData(data:NSData){
    
        let dict: NSDictionary!=(try! JSONSerialization.jsonObject(with: data as Data, options: JSONSerialization.ReadingOptions.mutableContainers)) as! NSDictionary
        print(dict)
        self.PostData()
    }
    
    func PostData(){
    
        let parameters : NSMutableDictionary? = [
    
            "UserID": String(300),
            "UserProfileID": String(356)]
    
            let manager = AFHTTPSessionManager()
    
            let serializerRequest = AFJSONRequestSerializer()
            serializerRequest.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
            manager.requestSerializer = serializerRequest
    
            let serializerResponse = AFJSONResponseSerializer()
            serializerResponse.readingOptions = JSONSerialization.ReadingOptions.allowFragments
            serializerResponse.acceptableContentTypes = ((((NSSet(object: "application/json") as! Set<String>) as Set<String>) as Set<String>) as Set<String>) as Set<String>;
            manager.responseSerializer = serializerResponse
            manager.post(Webserive.DefaultProfile, parameters: parameters, progress: nil, success: { (task: URLSessionDataTask, responseObject: Any?) in
            if (responseObject as? [String: AnyObject]) != nil {
    
                 print("responseObject \(responseObject)")
            }
        }) { (task: URLSessionDataTask?, error: Error) in
            print("POST fails with error \(error)")
        }
    }
    

    【讨论】:

      【解决方案3】:

      我有类似的问题。不知道问题的根源是什么,但您可以通过不指定某些参数的类型来帮助自己,在这种情况下,POST 方法调用中的“错误”:

      manager.post("http://...", parameters: [:], progress: nil, success: { (operation: URLSessionDataTask, responseObject: Any?) in
          print("Success")
      }, failure: { (operation: URLSessionDataTask?, error) in
          let error = error as? Error
          print("Failure, error is \(error?.description)")
      })
      

      通过这个 Code Pattern,我可以使用 Xcode 8.3 和 Swift 3 构建代码。


      编辑:

      如果您对“无法转换类型的值...”有问题,请检查函数期望的类型。

      我的问题是我将 Error 声明为 CoreData one,而 AFNetworking 肯定不会返回该错误类型。

      class Error: NSManagedObject {
      // Insert code here to add functionality to your managed object subclass
      }
      

      我需要改变的是:

      (operation: URLSessionDataTask?, error: Error?)
      

      到:

      (operation: URLSessionDataTask?, error: Swift.Error?)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-18
        • 2017-09-30
        • 1970-01-01
        • 1970-01-01
        • 2018-03-25
        • 2020-06-17
        相关资源
        最近更新 更多