2016-01-19 13 views
7

Przesyłam obrazy na serwer poprzez Alamofire.upload jako dane wieloczęściowe. W przeciwieństwie do Alamofire.request nie jest zwracany obiekt Request, którego zwykle używam do anulowania żądań.Jak anulować Alamofire.upload

Bardzo rozsądne jest jednak, aby móc anulować takie konsumujące żądania, takie jak przesyłanie. Jakie są tego opcje w Alamofire?

Odpowiedz

10

Na przykładzie Uploading MultiPartFormData z 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) 
     } 
    } 
) 

Tutaj upload.responseJSON zwraca Request, co powinno pozwolić na przypisanie go do czegoś, do odwołania później. Na przykład:

let request = upload.responseJSON { ... 

... 

request.cancel() 
+0

Jak dodać parametry do uploadu (Swift 3)? – lee

+0

Moja aplikacja zawsze zawiesza się na request.cancel(), jak odniosłeś sukces? – Raniys

1

Obawiam się, że nie może, zgodnie z kodem źródłowym Alamofire funkcja upload zwraca Request typu we wszystkich jego przeciążeń wyjątkiem w tych, które obsługują MultipartFormData patrz poniższy kod:

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

Zalecane jest pisanie kodu po stronie klienta, należy użyć multipart/form-data, gdy formularz zawiera jakiekolwiek elementy <input type="file">.

Więc jeśli chcesz po prostu przesłać obraz do serwera można korzystać z innego upload przeciążeń funkcję zwracającą obiekt Request i można je anulować, jak w zaproponowanych w dokumentacji Alamofire tych sposobów:

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

Mam nadzieję, że ci to pomoże.

+0

Oto 2 problemy: 1. przesyłanie zawsze rozłącza się na 2.03M, następnie żądanie limitu czasu; 2. nie może uzyskać danych odpowiedzi serwera; – Raniys