我正在使用Xcode版本9.0,Swift 3.2。我想将zip文件上传到指定的URL并在服务器端进程完成后获得响应。
我可以发送请求和上传文件。不幸的是,我无法应对。我遇到了下面列出的各种情况。
试验#1
Alamofire.upload(
multipartFormData: { multipartFormData in
multipartFormData.append(fileURL, withName: "encrypted_images")
},
to: "http://" + self.se.getIpAndPort() + "/enroll",
encodingCompletion: { encodingResult in
switch encodingResult {
case .success(let upload, _, _):
upload
.responseJSON(completionHandler: { (result) in
print("Start of responseJSON")
print(result)
do {
let readableJSON = try JSONSerialization.jsonObject(with: result.data!, options:.allowFragments) as! [String: Any]
let rStatus = readableJSON["status"] as! String
if rStatus == "Done" {
print("Status:Done")
self.endOfUploadRunFunctions(errorFlag: false)
}
}catch{
print("Status:Error")
self.endOfUploadRunFunctions(errorFlag: true)
}
print("End of responseJSON!")
})
case .failure(let encodingError):
print("Failure")
print(encodingResult)
if encodingError._code == NSURLErrorTimedOut {
print("Timeout error!")
}
print(encodingError)
self.endOfUploadRunFunctions(errorFlag: true)
}
}
)
输出#1
2017-10-16 16:55:36.558671+0300 MyApp Data[5500:1367406] Task <6A1894B9-7185-4B39-AD68-480548A1DAA3>.<1> finished with error - code: -1001
Start of responseJSON
FAILURE: Error Domain=NSURLErrorDomain Code=-1001 "The request timed out." UserInfo={NSUnderlyingError=0x1c044dd10 {Error Domain=kCFErrorDomainCFNetwork Code=-1001 "(null)" UserInfo={_kCFStreamErrorCodeKey=-2102, _kCFStreamErrorDomainKey=4}}, NSErrorFailingURLStringKey=http://192.168.115.1:9090/enroll, NSErrorFailingURLKey=http://192.168.115.1:9090/enroll, _kCFStreamErrorDomainKey=4, _kCFStreamErrorCodeKey=-2102, NSLocalizedDescription=The request timed out.}
Status:Error
End of responseJSON!
ServerSide#1
继续处理。从服务器到应用程序的响应还没有返回。
试验#2
我创建了另一个类来改变超时。它只是一个包装类,用于设置等待响应的时间间隔。
import Foundation
import Alamofire
class NetworkManager {
var manager: SessionManager
init() {
let configuration = URLSessionConfiguration.default
configuration.timeoutIntervalForRequest = 200
configuration.timeoutIntervalForResource = 200 // seconds
manager = Alamofire.SessionManager(configuration: configuration)
}
}
刚改变了我调用上传功能的方式。我在类中启动了对象,并使用该SessionManager对象来调用Alamofire的上传方法。
self.networkOperator.manager.upload(
multipartFormData: { multipartFor...
输出#2
2017-10-16 17:25:44.832541+0300 MyApp Data[5529:1377171] Task <448D0EF9-00D6-4E86-BD40-6E4A612892B5>.<1> finished with error - code: -1001
Start of responseJSON
FAILURE: Error Domain=NSURLErrorDomain Code=-1001 "The request timed out." UserInfo={NSErrorFailingURLStringKey=http://192.168.115.1:9090/enroll, NSErrorFailingURLKey=http://192.168.115.1:9090/enroll, _kCFStreamErrorDomainKey=4, _kCFStreamErrorCodeKey=-2103, NSLocalizedDescription=The request timed out.}
Status:Error
End of responseJSON!
ServerSide#2
在输出打印到Xcode控制台之前已完成处理。服务器已使用JSON格式的答案返回HTTP 200和状态为Done。
我尝试将超时间隔更改为600并且它给出了相同的结果。服务器说&#34;好的&#34;,但应用说&#34;超时错误&#34;。
我还做过另一项测试来了解系统是否工作。我忽略了服务器端的进程,只是返回了Done。它完美地运作。但是我必须在服务器中做一些工作,所以app应该等待响应。
我还测试了Alamofire-Synchronous。是的,它也不起作用。
我缺少什么?我已经看到有关Alamofire的一些主题是异步的,它不是线程安全的。那么我该怎么做来处理这种情况呢?
由于