2016-01-19 3 views
7

Sto caricando le immagini sul server tramite Alamofire.upload come dati multipart. A differenza di Alamofire.request, non restituisce l'oggetto Request, che di solito utilizzo per annullare le richieste.Come annullare Alamofire.upload

Ma è molto ragionevole essere in grado di cancellare richieste così impegnative come il caricamento. Quali sono le opzioni per questo in Alamofire?

risposta

10

Utilizzando l'esempio Uploading MultiPartFormData dal 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) 
     } 
    } 
) 

Qui, upload.responseJSON restituisce una Request, che dovrebbe consentire di assegnare a qualcosa per la cancellazione in seguito. Per esempio:

let request = upload.responseJSON { ... 

... 

request.cancel() 
+0

Come aggiungere parametri al caricamento (Swift 3)? – lee

+0

La mia app si arresta sempre su request.cancel(), come l'hai fatta? – Raniys

1

Temo che non è possibile, in base al codice sorgente Alamofire la funzione upload restituisce un Request tipo in tutte le sue sovraccarichi tranne in questi che supportano MultipartFormData vedere il codice seguente:

// 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 
    ) 
} 

Si consiglia quando si scrive codice lato client, utilizzare multipart/form-data quando il modulo include qualsiasi elemento <input type="file">.

Quindi, se si desidera caricare solo un'immagine al server è possibile utilizzare le altre upload funzione sovraccarichi che restituisce un oggetto Request ed è possibile annullarlo come in questa modalità proposte nella documentazione Alamofire:

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

Spero che questo ti aiuti.

+0

Qui sono 2 problemi: 1. l'upload sempre riagganciare sul 2.03m, la richiesta di essere timeout; 2. non può ottenere i dati di risposta del server; – Raniys