AFNetwoking с swift 3.0 и xcode 8: запрос POST и запрос GET

Я пытаюсь проанализировать данные с помощью AFNetworking & swift 3.0 и xcode 8.0, но получаю сообщение об ошибке, как показано ниже. Код ниже отлично работает для swift 2.3, но не работает в 3.0.

Или, если кто-нибудь знает об AFNetworking и swift 3.0 с использованием xcode 8.0 для запросов POST и GET, сообщите мне. с простым примером. Заранее спасибо

Вы можете увидеть ниже ошибку.

введите здесь описание изображения

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

person Deep    schedule 22.09.2016    source источник
comment
Пожалуйста, обратитесь по ссылке (stackoverflow.com/questions/39508868/), который вам поможет.   -  person Ramkrishna Sharma    schedule 22.09.2016


Ответы (3)


Измените тип ошибки с NSERROR на ERROR. Совместимость типов изменена с Swift 2.3 на Swift 3.0.

person Bhaskar    schedule 05.10.2016

Попробуй это:

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)")
    }
}
person Onkar Borse    schedule 19.04.2017

У меня была аналогичная проблема. Не знаю, в чем корень проблемы, но вы можете помочь себе, не указав тип какого-либо параметра, в данном случае «ошибка» в вызове метода 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 и Swift 3.


РЕДАКТИРОВАТЬ:

Если у вас возникли проблемы с "Невозможно преобразовать значение типа...", проверьте тип, который ожидает функция.

Моя проблема заключалась в том, что у меня было объявление Error как CoreData one, и AFNetworking определенно не возвращает этот тип Error.

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

Что мне нужно было изменить, так это:

(operation: URLSessionDataTask?, error: Error?)

to:

(operation: URLSessionDataTask?, error: Swift.Error?)
person vedrano    schedule 21.04.2017