2016-09-20 7 views
42

Благодаря миграции на Swift 3 мне сложно скомпилировать мой проект, в котором используется Alamofire.Swift 3 Alamofire multipart upload

Проблема возникает при загрузке multipartFormData:

Alamofire.upload(.POST, URL, headers: headers, multipartFormData: { 
     multipartFormData in 
. 
. 
. 
}) 

Неоднозначность ссылка на члена 'загрузки (_: до: метод: заголовки :)

Любая помощь очень ценится, спасибо в заранее!

ПОСТАНОВИЛИ:

Alamofire.upload(multipartFormData: { (multipartFormData) in 

     multipartFormData.append(fileData, withName: "file_pack", fileName: "file_pack", mimeType: "text/plain") 


     for (key, value) in self.parameters { 
      multipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: key) 
     } 
     }, with: URL2, encodingCompletion: { (result) in 

      switch result { 
      case .success(let upload, _, _): 

       upload.responseJSON { response in 
        self.delegate?.showSuccessAlert() 
        print(response.request) // original URL request 
        print(response.response) // URL response 
        print(response.data)  // server data 
        print(response.result) // result of response serialization 
        //      self.showSuccesAlert() 
        self.removeImage("frame", fileExtension: "txt") 
        if let JSON = response.result.value { 
         print("JSON: \(JSON)") 
        } 
       } 

      case .failure(let encodingError): 
       self.delegate?.showFailAlert() 
       print(encodingError) 
      } 

    }) 

Это, как метод загрузки должен быть реализован в Swift 3

+1

Подписи методов изменены. Комментируйте свои существующие и позвольте автозаполнению Xcode направлять вас для написания новых. – Moritz

+1

, и вы также можете пойти в alamofire на gitub. https://github.com/Alamofire/Alamofire – Sahil

ответ

35

Например, при использовании Alamofire 4.0.0 в Swift 3:

(убедитесь, что вы готовы к работе 4.0.0, так как похоже, что у вас нет обновления ованные ваш Alamofire пока)

Alamofire.upload(multipartFormData: { (multipartFormData) in 
     // code 
    }, to: URL, encodingCompletion: { (result) in 
     // code 
    }) 

или

Alamofire.upload(multipartFormData: { (multipartFormData) in 
     // code 
    }, with: URL, encodingCompletion: { (result) in 
     // code 
    }) 

Так headers необходимо передать по запросу URL:

let URL = try! URLRequest(url: "http://example.com", method: .get, headers: headers) 
+0

еще один вопрос, какой код должен идти первым заполнителем (multipartFormData in) и что должно быть в последнем (результат)? Раньше было только одно закрытие – DCDC

+0

Не обязательно заполнять его кодом, закрытие для вас в конечном итоге. Но, я думаю, закрытие завершений полезно, поскольку вы получаете обратную связь, так как это асинхронный метод. – pedrouan

+0

Давайте продолжим обсуждение в чате (http://chat.stackoverflow.com/rooms/123785/discussion-between-dcdc-and-pedrouan). – DCDC

6

попробовать это и URL установлен как @pedrouan сказал.

Alamofire.upload(multipartFormData: { (multipartFormData) in 
     multipartFormData.append(imageData, withName: "xyz", fileName: "file.jpeg", mimeType: "image/jpeg") 
}, to: url) 
{ (result) in 
     //result 
} 
1

В быстром 3, пытаясь установить multipartFormData как @DCDC, указано в его решении. XCode пытаются бросить в AnyObject перед тем .data(), так что вместо

value.data(using: String.Encoding.utf8)!, withName: key 

Я сделал

[replace_your_var_name_here].data(using: String.Encoding.utf8)!, withName: key 

В моем случае мой список вар был не большой, так жестко прописывать вариант.

0

Для Swift 3 и Alamofire ~ 4.3.0

Если кто-то, как я пытался получить объект запроса синхронно (без использования блокировок или dispatch_groups), вы можете использовать этот подход:

// outer function 
... 
let string = "string to send" 
let multipartFormData = MultipartFormData() 
multipartFormData.append(string.data(using: .utf8)!, withName: "str") 

guard let data = try? multipartFormData.encode() else { 
    // fail appropriately 
} 

let request = sessionManager.upload(data, 
            to: url, 
            method: .post, 
/* this is VERY IMPORTANT LINE */ headers: ["Content-Type" : multipartFormData.contentType]) 

request.validate() 
// do whatever you need with request 

Обратите внимание, что вам нужно установить Content-Type заголовок от вас multipartFormData, так как он содержит границы.

Если вам не нужно иметь своего объекта запроса синхронно другой ответ с

Alamofire.upload(multipartFormData: { (multipartFormData) in 

работает, как ожидалось. В случае успешного кодирования данных он вернет вам объект запроса при закрытии обратного вызова.

ВАЖНОЕ ЗАМЕЧАНИЕ:, если вы используете описанный мной метод, он заблокирует ваш поток (в большинстве случаев вы, вероятно, в основном потоке), чтобы скопировать и закодировать ваши данные. Поэтому не используйте его для больших файлов или что-то еще. Это асинхронно в Аламофире.

+0

Где находится 'sessionManager'? – Arbitur

+0

@Arbitur это экземпляр Alamofire.SessionManager, который вы используете для запроса. В моем производственном коде он создается один раз, когда приложение инициализируется и используется во всем приложении. В этом конкретном фрагменте ответа можно создать код, обозначенный как «...» после // внешней функции. Хотя это опять-таки не актуально, когда вы создали свой менеджер сеансов для этого фрагмента. – user1264176

Смежные вопросы