2016-01-19 8 views
7

Ich lade Bilder auf dem Server über Alamofire.upload als mehrteilige Daten. Im Gegensatz zu Alamofire.request gibt es Request Objekt nicht zurück, die ich normalerweise zum Abbrechen von Anforderungen verwenden.So stornieren Sie Alamofire.upload

Aber es ist sehr vernünftig, in der Lage zu sein, solche aufwändigen Anfragen wie das Hochladen abzubrechen. Welche Möglichkeiten gibt es in Alamofire?

Antwort

10

Mit dem Uploading MultiPartFormData Beispiel aus der Alamofire README:

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

Hier upload.responseJSON gibt ein Request, mit dem Sie es zu etwas für die Stornierung später zuweisen lassen soll. Zum Beispiel:

let request = upload.responseJSON { ... 

... 

request.cancel() 
+0

Wie füge ich Parameter in den Upload ein (Swift 3)? – lee

+0

Meine App stürzt immer auf request.cancel() ab, wie du es geschafft hast? – Raniys

1

Ich fürchte, Sie können nicht nach dem Quellcode Alamofire die upload Funktion gibt einen Request Art in all seinen Überlastungen außer in diese, die MultipartFormData siehe den folgenden Code unterstützen:

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

Es wird empfohlen, wenn Sie clientseitigen Code schreiben, multipart/form-data zu verwenden, wenn Ihr Formular <input type="file"> Elemente enthält.

Also, wenn Sie wollen einfach nur ein Bild auf den Server hochladen können Sie die anderen upload Funktion Überlastungen verwenden, die ein Request Objekt zurückgibt und Sie können es abbrechen wie in dieser Weise in der Alamofire Dokumentation vorgeschlagen:

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

Ich hoffe das hilft dir.

+0

Hier haben 2 Probleme: 1. der Upload immer auf 2.03M hängen, dann die Anfrage, Timeout sein; 2. kann die Serverantwortdaten nicht erhalten; – Raniys

Verwandte Themen