3

我正在进行网络调用以将图像上传到后端服务器。现在我正在使用以下代码。此代码在互联网在线的条件下完美运行。

// 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 是否成功。不适用于网络调用本身。

如何检查网络调用是否成功?它正在返回虚空。

进口注意事项:

  • 如果我们收到 200 代码,服务器返回 nill,这意味着已经上传了图像。
4

1 回答 1

4

如果您要使用状态码来确定成功或失败,您应该添加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)
            }
        }
    }
}
于 2017-03-30T02:06:25.773 回答