2017-03-30 6 views
3

Ich mache einen Netzwerkanruf, um ein Bild auf einen Backend-Server hochzuladen. Im Moment benutze ich folgendes um zu programmieren. Dieser Code funktioniert perfekt, wenn das Internet online ist.So überprüfen Sie, ob der mehrteilige Upload erfolgreich war: alamofire image

// MARK: - PUT 

    static func PUT(URL: String, 
        data: Data, 
        mimeType: String, 
        headers: [String: String]?) -> Promise<Void> 
    { 
     return Promise { fulfill, reject in 

      let URL = try! URLRequest(url: URL, method: .put, headers: headers) 

      Alamofire.upload(
       multipartFormData: { multipartFormData in 

        multipartFormData.append(InputStream.init(data: data), withLength: UInt64(data.count), name: "image", fileName: "file.png", mimeType: mimeType) 
      }, 
      with: URL, 
      encodingCompletion: { encodingResult in 
       switch encodingResult { 
        case .success(let upload, _, _): 
        upload.responseJSON { response in 

         if response.result.value == nil { 
          fulfill() 
         }else { 
          reject(response.result.error!) 
         } 
        } 
        case .failure(_): 
        break 
       } 
      }) 
     } 
    } 
} 

Wenn ich es in den Offline-Modus versetzt. Es führt immer noch die Funktion aus und erfüllt immer noch() das Versprechen. Selbst wenn das Netzwerk offline ist. Ich denke, das liegt daran, dass überprüft wird, ob das encodingResult erfolgreich ist oder nicht. NOt für den Netzwerkanruf selbst.

Wie kann ich überprüfen, ob der Netzwerkanruf erfolgreich war oder nicht? Es kehrt Void zurück.

Beste, kevin.

Import Hinweise:

  • Server gibt nill wenn wir 200-Code erhalten, was bedeutet, dass das Bild hochgeladen haben.
+0

ich das nicht verstehen. Erstens, du erfüllst oder verweigst es nicht im Fall von "Failure". Ich hätte gedacht, dass du "ablehnen" willst. Zweitens, wenn die Antwort "Erfolg" war, aber es gab keinen "Wert", erfüllst du das Versprechen, aber wenn du einen "Wert" erhalten hast, lehnst du ab. Das scheint rückwärts zu sein. – Rob

+0

Der Server gibt "nil" zurück, wenn wir einen 200-Code haben. So ist es eingerichtet. Du hast Recht, dass ich eine Ablehnung in der .failure hinzufügen muss, aber das ändert nichts an der Situation. –

+0

Wie würden Sie den bestehenden Code ändern? :) Danke für den Tipp übrigens –

Antwort

2

Wenn Sie vorhaben, Statuscodes zu verwenden, Erfolg oder Misserfolg zu ermitteln, sollten Sie hinzufügen validate:

Zum Beispiel:

static func PUT(URL: String, 
       data: Data, 
       mimeType: String, 
       headers: [String: String]?) -> Promise<Void> { 
    return Promise { fulfill, reject in 

     let URL = try! URLRequest(url: URL, method: .put, headers: headers) 

     Alamofire.upload(
      multipartFormData: { multipartFormData in 
       multipartFormData.append(data, withName: "image", fileName: "file.png", mimeType: mimeType) 
     }, with: URL) { encodingResult in 
      switch encodingResult { 
      case .success(let upload, _, _): 
       upload 
        .validate(statusCode: 200 ..< 300) 
        .responseJSON { response in 
         switch response.result { 
         case .success: 
          fulfill() 
         case .failure(let error): 
          reject(error) 
         } 
       } 
      case .failure(let error): 
       reject(error) 
      } 
     } 
    } 
} 

oben Das setzt voraus, dass nach einem erfolgreichen Antwort, Sie‘ Ich bekomme auch JSON Antwort. Möglicherweise möchten Sie weitere Prüfungen von value durchführen.

Wenn Sie nicht JSON auf Erfolg zurückkehren, dann benutzen Sie einfach response, nicht responseJSON:

static func PUT(URL: String, 
       data: Data, 
       mimeType: String, 
       headers: [String: String]?) -> Promise<Void> { 
    return Promise { fulfill, reject in 
     let URL = try! URLRequest(url: URL, method: .put, headers: headers) 

     Alamofire.upload(
      multipartFormData: { multipartFormData in 
       multipartFormData.append(data, withName: "image", fileName: "file.png", mimeType: mimeType) 
     }, with: URL) { encodingResult in 
      switch encodingResult { 
      case .success(let upload, _, _): 
       upload 
        .validate(statusCode: 200 ..< 300) 
        .response { response in 
         if let error = response.error { 
          reject(error) 
         } else { 
          fulfill() 
         } 
       } 
      case .failure(let error): 
       reject(error) 
      } 
     } 
    } 
} 
Verwandte Themen