2017-03-30 1 views
3

네트워크 호출을 통해 이미지를 백엔드 서버에 업로드하고 있습니다. 지금 나는 코드 작성에 다음을 사용하고있다. 이 코드는 인터넷이 온라인 상태 인 상황에서 완벽하게 작동합니다.멀티 파트 업로드가 alamofire 이미지로 성공했는지 확인하는 방법

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

경우에 따라 오프라인 모드로 전환했습니다. 그것은 여전히 ​​함수를 실행하고 여전히 약속을 fullfills()합니다. 심지어 네트워크가 오프라인 상태입니다. 나는 이것이 encodingResult가 성공적인지 아닌지를 검사하기 때문에 이것이라고 생각한다. 네트워크 호출 자체에 대해서는 NOt입니다.

네트워크 통화가 성공했는지 여부를 어떻게 확인할 수 있습니까? 공허로 돌아갑니다.

최고, 케빈.

가져 오기 노트 : 우리는 이미지를 업로드 한 것을 의미한다 (200) 코드를받은 경우

  • 서버가 빈 채로을 반환합니다. 당신이 성공 또는 실패를 결정하는 상태 코드를 사용하려고하는 경우
+0

내가 이것을 이해하지 않습니다. 첫째, 당신은'.failure'의 경우에 이행하거나 거절하지 않습니다. 나는 당신이'거부 할 것'이라고 생각했을 것이다. 둘째로, 응답이'.success' 였지만'value'가 없다면 당신은 약속을 이행하고 있습니다. 그러나 당신이'value'를 얻었다면 당신은 거부하고 있습니다. 그것은 거꾸로 보인다. – Rob

+0

우리는 200 개의 코드가 있다면 서버는 "nil"을 반환합니다. 그것이 설치 방법입니다. 당신은 .failure에 거부를 추가 할 필요가 있지만 그것이 상황을 바꾸지는 않는다는 것은 맞습니다. –

+0

기존 코드를 어떻게 변경 하시겠습니까? :) 팁 btw 주셔서 감사합니다 –

답변

2

, 당신은 validate 추가해야합니다 : 예를 들어

:

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

을 위의 가정이 성공적인 응답에 따라, 당신이 ' 또한 JSON 응답을받을 것이다. value에 대한 추가 점검을 수행 할 수 있습니다. 당신이 성공을 JSON을 반환하지 않는 경우

, 그럼 그냥 response하지 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) 
      } 
     } 
    } 
}