2016-09-22 116 views
1

我想解析数据使用AFNetworking & swift 3.0和xcode 8.0,但我得到像下面的错误。下面的代码适用于swift 2.3但不工作在3.0AFNetwoking与迅速3.0&xcode 8:POST请求和GET请求

或者如果有人知道AFNetworking & swift 3.0使用xcode 8.0进行POST & GET请求请告诉我。以简单的例子。 在此先感谢

您可以看到下面的错误。

enter image description here

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)?' 
+0

请参考链接(http://stackoverflow.com/questions/39508868/completion-handlers-错误在迅速3和Xcode 8),这将帮助你。 –

回答

1

变化从NSERROR你的错误类型错误。从Swift2.3改为雨燕3.0

0

类型兼容性试试这个:

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)") 
    } 
} 
0

我有类似的问题。不知道什么是问题的根源,但你可以不指定某个参数的类型,在这种情况下,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)") 
}) 

有了这个代码模式,我可以建立一个与代码的Xcode 8.3和斯威夫特3.


编辑:

如果你有一些问题,“无法将类型的价值...”,请键入该函数的期望。

我的问题是,我已经声明错误为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?)