2016-01-19 4 views
7

Я загружаю изображения на сервер через Alamofire.upload как многостраничные данные. В отличие от Alamofire.request, он не возвращает Request объект, который я обычно использую для отмены запросов.Как отменить Alamofire.upload

Но очень разумно иметь возможность отменить такие потребительские запросы, как загрузка. Каковы варианты этого в Alamofire?

ответ

10

Используя Uploading MultiPartFormData пример из README Alamofire:

Alamofire.upload(
    .POST, 
    "https://httpbin.org/post", 
    multipartFormData: { multipartFormData in 
     multipartFormData.appendBodyPart(fileURL: unicornImageURL, name: "unicorn") 
     multipartFormData.appendBodyPart(fileURL: rainbowImageURL, name: "rainbow") 
    }, 
    encodingCompletion: { encodingResult in 
     switch encodingResult { 
     case .Success(let upload, _, _): 
      upload.responseJSON { response in 
       debugPrint(response) 
      } 
     case .Failure(let encodingError): 
      print(encodingError) 
     } 
    } 
) 

Здесь upload.responseJSON возвращает Request, который должен позволить вам, чтобы назначить его на что-то для аннулирования позже. Например:

let request = upload.responseJSON { ... 

... 

request.cancel() 
+0

Как добавить параметры в загрузку (Swift 3)? – lee

+0

Мое приложение всегда терпит крах на request.cancel(), как вы это сделали? – Raniys

1

Я боюсь, что вы не можете, в соответствии с исходным кодом Alamofire функция upload возвращает Request тип во всех его перегрузками кроме в них, которые поддерживают MultipartFormData см следующий код:

// MARK: MultipartFormData 

/** 
Creates an upload request using the shared manager instance for the specified method and URL string. 

- parameter method:     The HTTP method. 
- parameter URLString:    The URL string. 
- parameter headers: The HTTP headers. `nil` by default. 
- parameter multipartFormData:  The closure used to append body parts to the `MultipartFormData`. 
- parameter encodingMemoryThreshold: The encoding memory threshold in bytes. `MultipartFormDataEncodingMemoryThreshold` 
           by default. 
- parameter encodingCompletion:  The closure called when the `MultipartFormData` encoding is complete. 
*/ 
public func upload(
    method: Method, 
    URLString: URLStringConvertible, 
    headers: [String: String]? = nil, 
    multipartFormData: MultipartFormData -> Void, 
    encodingMemoryThreshold: UInt64 = Manager.MultipartFormDataEncodingMemoryThreshold, 
    encodingCompletion: (Manager.MultipartFormDataEncodingResult -> Void)?) 
{ 
    return Manager.sharedInstance.upload(
     method, 
     URLString, 
     headers: headers, 
     multipartFormData: multipartFormData, 
     encodingMemoryThreshold: encodingMemoryThreshold, 
     encodingCompletion: encodingCompletion 
    ) 
} 

/** 
Creates an upload request using the shared manager instance for the specified method and URL string. 

- parameter URLRequest:    The URL request. 
- parameter multipartFormData:  The closure used to append body parts to the `MultipartFormData`. 
- parameter encodingMemoryThreshold: The encoding memory threshold in bytes. `MultipartFormDataEncodingMemoryThreshold` 
           by default. 
- parameter encodingCompletion:  The closure called when the `MultipartFormData` encoding is complete. 
*/ 
public func upload(
    URLRequest: URLRequestConvertible, 
    multipartFormData: MultipartFormData -> Void, 
    encodingMemoryThreshold: UInt64 = Manager.MultipartFormDataEncodingMemoryThreshold, 
    encodingCompletion: (Manager.MultipartFormDataEncodingResult -> Void)?) 
{ 
    return Manager.sharedInstance.upload(
     URLRequest, 
     multipartFormData: multipartFormData, 
     encodingMemoryThreshold: encodingMemoryThreshold, 
     encodingCompletion: encodingCompletion 
    ) 
} 

Рекомендуется, когда вы пишете код на стороне клиента, используйте multipart/form-data, если ваша форма включает любые элементы <input type="file">.

Так что, если вы хотите просто загрузить изображение на сервер можно использовать в другие upload перегруженных функциях, которая возвращает Request объекта, и вы можете отменить его, как в этом способах, предложенных в Alamofire документации:

let fileURL = NSBundle.mainBundle().URLForResource("Default", withExtension: "png") 
ler request =Alamofire.upload(.POST, "https://httpbin.org/post", file: fileURL) 
// request.cancel() 

Надеюсь, это поможет вам.

+0

Здесь есть 2 проблемы: 1. загрузка всегда зависает на 2.03M, затем запрос на таймаут; 2. не может получить данные ответа сервера; – Raniys

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