gpt4 book ai didi

ios - NSURLSession 委托(delegate)队列中的死锁

转载 作者:行者123 更新时间:2023-11-28 06:48:34 25 4
gpt4 key购买 nike

使用 Alamofire 时,我在 NSUrlSession 委托(delegate)队列中的一个操作中遇到死锁。

它发生在我同时进行至少一次下载和一次上传时(所有请求都通过默认的 Alamofire 管理器完成)。从多个线程这样做有什么问题吗? (在 NSUrlSession 或 Alamofire 中)

它似乎停留在 NSURLSession 委托(delegate)队列中的一个操作中的 __psynch_mutexwait 上,并且它完全关闭了应用程序通过 Alamofire 发出网络请求的能力(因为委托(delegate)永远不会被调用)。

正如我所说,下载和上传在 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)")
}
}
}

stack trace

最佳答案

在评论了我的大部分代码后,我隔离了导致问题的代码,它与 alamofire 或 NSURLSession 完全无关。

我在自己的代码中调用了一个(对象的)数组上的 objc_sync_enter,它总是在同一个数组上有一个匹配的 objc_sync_exit 调用。将此调用更改为 self 而不是此数组后,NSBlockOperation 中的死锁就消失了。这可能与数组不是对象而是结构体有关。因此,如果您在代码中遇到非常奇怪的死锁,我建议您在尝试任何其他操作之前,确保您没有对结构调用 objc_sync_enter

关于ios - NSURLSession 委托(delegate)队列中的死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35560022/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com