【发布时间】:2016-06-04 06:08:40
【问题描述】:
在使用 Alamofire 时,我在 NSUrlSession 委托队列中的一项操作中遇到了死锁。
当我同时进行至少一次下载和一次上传时会发生这种情况(所有请求都通过默认的 Alamofire 管理器完成)。从多个线程这样做有什么问题吗? (在 NSUrlSession 或 Alamofire 中)
它似乎卡在 NSURLSession 委托队列中的一项操作中的 __psynch_mutexwait 上,并且它完全关闭了应用程序通过 Alamofire 发出网络请求的能力(因为永远不会调用委托)。
正如我所说,下载和上传在 2 个不同的队列上同时调用(其中一个通常在主线程上调用)
上传示例:
Alamofire.upload(.POST, uploadURL,
multipartFormData: { multipartFormData in
multipartFormData.appendBodyPart(data: x.dataUsingEncoding(NSUTF8StringEncoding)!, name: "X")
multipartFormData.appendBodyPart(data: fileData, name: "file", fileName: "Y", mimeType: "application/octet-stream")
}
},
encodingCompletion: { encodingResult in
switch encodingResult {
case .Success(let upload, _, _):
upload.response { (request, response, data, error) -> Void in
if let error = error {
callback("Failure", "\(error)")
} else {
callback("SUCCESS", nil)
}
}
case .Failure(let encodingError):
callback(nil, "Failed due to \(encodingError)")
}
}
)
下载示例:
Alamofire.download(.GET, downloadUrl, parameters: ["a": "a", "b": "b"], destination:
{
tempURL, response in
return path
}).response {
(request, response, _, error) in
let data = NSData(contentsOfURL: path)
doSomeStuffWithDownloadedData(data)
// make another request after download completed
Alamofire.request(.GET, requestUrl, parameters: ["c":"c", "d":"d"]).response {
request, response, data, error in
if let e = error {
log.error("request failed, \(e)")
}
}
}
【问题讨论】:
-
您有示例代码和/或我们可以查看的一些输出或日志吗?
-
添加了代码示例和堆栈跟踪
标签: ios multithreading swift nsurlsession alamofire