Alamofire 5 завершает кодировку загрузки

#swift #alamofire

#swift #alamofire

Вопрос:

Я работаю с Swift 4 и Alamofire 5, загружаю две многострочные фотографии и хочу распечатать прогресс

  AF.upload(
        multipartFormData: { MultipartFormData in

            MultipartFormData.append(firstPic, withName: "first_pic", fileName: "image.jpeg", mimeType: "image/jpeg")
            MultipartFormData.append(secondPic, withName: "second_pic", fileName: "image.jpeg", mimeType: "image/jpeg")

    }, to: urlString, encodingCompletion: { encodingResult in
        switch encodingResult {
        case .Success(let upload, _, _):
            upload.progress { bytesRead, totalBytesRead, totalBytesExpectedToRead in
                print(totalBytesRead)
            }
            upload.responseJSON { request, response, result in
                print(result)
            }
        case .Failure(let encodingError):
            print(encodingError)
        }
    })
  

и при этом выдается сообщение об ошибке

Метки аргументов ‘(multipartFormData:, to:, encodingCompletion:)’ не соответствуют никаким доступным перегрузкам

библиотека обновила код или что-то еще??

Комментарии:

1. AF это хороший ярлык для Alamofire 🙂

2. @vpoltave На самом деле это то, что использует Alamofire 5, и да, это хороший AF :»D

Ответ №1:

Пожалуйста, измените в соответствии с вашими потребностями

 func upload(image: Data, to url: Alamofire.URLRequestConvertible, params: [String: Any]) {
    AF.upload(multipartFormData: { multiPart in
        for (key, value) in params {
            if let temp = value as? String {
                multiPart.append(temp.data(using: .utf8)!, withName: key)
            }
            if let temp = value as? Int {
                multiPart.append("(temp)".data(using: .utf8)!, withName: key)
            }
            if let temp = value as? NSArray {
                temp.forEach({ element in
                    let keyObj = key   "[]"
                    if let string = element as? String {
                        multiPart.append(string.data(using: .utf8)!, withName: keyObj)
                    } else
                        if let num = element as? Int {
                            let value = "(num)"
                            multiPart.append(value.data(using: .utf8)!, withName: keyObj)
                    }
                })
            }
        }
        multiPart.append(image, withName: "file", fileName: "file.png", mimeType: "image/png")
    }, with: url)
        .uploadProgress(queue: .main, closure: { progress in
            //Current upload progress of file 
            print("Upload Progress: (progress.fractionCompleted)")
        })
        .responseJSON(completionHandler: { response in
            //Do what ever you want to do with response
                if let error = response.error {
                    print(error)
                }
                guard let data = response.value else {
                    return 
                }
                print(value)
        })
}
  

Комментарии:

1. Где в этом блок сбоя?

2. спасибо, у меня это работает, но, как сказал @VarunNaharia, где мы можем получить сообщение об ошибке при сбое сетевого вызова?

3. @SohaibSiddique в ответе обработчика компиляции является типом результата, который содержит как значение, так и ошибку. Пожалуйста, ознакомьтесь с обновлением

Ответ №2:

Alamofire 5 больше не требует encodingCompletion ! Вместо этого кодирование формы из нескольких частей выполняется как часть стандартного теперь асинхронного процесса запроса и будет возвращать ошибки в Request , и они доступны во время вызовов validate и response* .

Комментарии:

1. Спасибо, моя дорогая, есть ли простой способ ускорить загрузку в alamofire 5?

2. uploadProgress может использоваться как предыдущий progress .

Ответ №3:

 let headers: HTTPHeaders = [
            /* "Authorization": "your_access_token",  in case you need authorization header */
            "Content-type": "multipart/form-data"
        ]


            AF.upload(
                multipartFormData: { multipartFormData in
                    multipartFormData.append(imageOrVideo!.jpegData(compressionQuality: 0.5)!, withName: "upload_data" , fileName: "file.jpeg", mimeType: "image/jpeg")
            },
                to: "http://----/new.php", method: .post , headers: headers)
                .response { resp in
                    print(resp)


            }