Ios NSURLSession委托队列内的死锁
使用Alamofire时,NSUrlSession委托队列中的一个操作出现死锁 当我同时进行至少一次下载和一次上载时,就会发生这种情况(所有请求都是通过默认的Alamofire管理器完成的)。从多个线程执行此操作是否有任何问题?(在NSUrlSession或Alamofire中) 在NSURLSession委托队列中的一个操作中,它似乎卡在了uu psynch_mutexwait上,完全关闭了应用程序通过Alamofire发出网络请求的功能(因为永远不会调用该委托) 正如我所说,下载和上传在两个不同的队列上同时调用(其中一个通常在主线程上调用) 上传示例:Ios NSURLSession委托队列内的死锁,ios,multithreading,swift,nsurlsession,alamofire,Ios,Multithreading,Swift,Nsurlsession,Alamofire,使用Alamofire时,NSUrlSession委托队列中的一个操作出现死锁 当我同时进行至少一次下载和一次上载时,就会发生这种情况(所有请求都是通过默认的Alamofire管理器完成的)。从多个线程执行此操作是否有任何问题?(在NSUrlSession或Alamofire中) 在NSURLSession委托队列中的一个操作中,它似乎卡在了uu psynch_mutexwait上,完全关闭了应用程序通过Alamofire发出网络请求的功能(因为永远不会调用该委托) 正如我所说,下载和上传在两个
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)")
}
}
}
下载示例:
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)")
}
}
}
在注释了我的大部分代码后,我隔离了导致问题的代码,它与alamofire或NSURLSession完全没有关系
我在自己的代码中调用了一个数组(对象)上的
objc\u sync\u enter
,它在同一个数组上总是有一个匹配的objc\u sync\u exit
调用。将此调用更改为启用self
而不是此数组后,NSBlockOperation中的死锁消失。这可能与数组不是对象而是结构这一事实有关。因此,如果您在代码中遇到非常奇怪的死锁,我建议您在尝试其他操作之前,确保在结构上没有调用objc\u sync\u enter
。是否有示例代码和/或一些我们可以查看的输出或日志?添加了代码示例和堆栈跟踪可以在数组上发布关于死锁的代码。我使用AFN网络也遇到了同样的问题。