Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios NSURLSession委托队列内的死锁_Ios_Multithreading_Swift_Nsurlsession_Alamofire - Fatal编程技术网

Ios NSURLSession委托队列内的死锁

Ios NSURLSession委托队列内的死锁,ios,multithreading,swift,nsurlsession,alamofire,Ios,Multithreading,Swift,Nsurlsession,Alamofire,使用Alamofire时,NSUrlSession委托队列中的一个操作出现死锁 当我同时进行至少一次下载和一次上载时,就会发生这种情况(所有请求都是通过默认的Alamofire管理器完成的)。从多个线程执行此操作是否有任何问题?(在NSUrlSession或Alamofire中) 在NSURLSession委托队列中的一个操作中,它似乎卡在了uu psynch_mutexwait上,完全关闭了应用程序通过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网络也遇到了同样的问题。