繁体   English   中英

当 DataTask 在 OperationQueue 上运行时,NSURLSession .waitsForConnectivity 标志被忽略

[英]NSURLSession .waitsForConnectivity flag ignored when DataTask being run on OperationQueue

我有一个手写类 MyURLRequest,它实现了操作。 在它里面创建 URLSession,配置它

public init(shouldWaitForConnectivity: Bool, timeoutForResource: Double?) {
    baseUrl = URL(string: Self.relevantServerUrl + "api/")
    self.shouldWaitForConnectivity = shouldWaitForConnectivity
    self.timeoutForResource = timeoutForResource
    super.init()
    localURLSession = URLSession(configuration: localConfig, delegate: self, delegateQueue: nil)

}

public var localConfig: URLSessionConfiguration {
    let res = URLSessionConfiguration.default
    res.allowsCellularAccess = true
    if let shouldWaitForConnectivity = shouldWaitForConnectivity {
        res.waitsForConnectivity = shouldWaitForConnectivity
        if let timeoutForResource = timeoutForResource {
            res.timeoutIntervalForResource = timeoutForResource
        }
    }
    return res
}

创建 URLRequest、dataTask,然后在 OperationQueue 上运行。 操作的方法看起来像这样

override open func start() {
    if isCancelled {
        isFinished = true
        return
    }
    
    startDate = Date()
    sessionTask?.resume()
    localURLSession.finishTasksAndInvalidate()
}

override open func cancel() {
    super.cancel()
    sessionTask?.cancel()
}

MyURLRequest 还实现了URLSessionDataDelegateURLSessionTaskDelegate以及它自己的 URLSession 的委托。

waitsForConnectivity NSURLSessionConfiguration 的标志有问题。 在构造函数中,我将其设置为 true,但此标志被忽略。 在运行时,当网络关闭时,请求立即完成并显示错误 -1009。 URLSessionTaskDelegate 的方法urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?)立即触发。 func urlSession(_ session: URLSession, taskIsWaitingForConnectivity task: URLSessionTask)根本没有被调用。

绝对不是的原因是标志 waitsForConnectivity 没有正确设置:我检查了urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?)和 waitsForConnectivity == true 接收到的任务中的配置。

我还尝试在没有操作队列的情况下发出请求,结果很好 - 表现如预期。 可能跟 OperationQueue 有关系。 感谢您的帮助!

我相信这个问题的根源在于您对finishTasksAndInvalidate的使用。 看起来您正在依赖该方法同步等待所有挂起的任务完成,但根据文档,它不是如何工作的。

为了实现你想要的,我认为你需要重构你的NSOperation子类以完全异步并且只有在启动的任务完成后才能完成。

构建一个完全线程安全的异步NSOperation子类是一个真正的痛苦。 如果这不是您以前解决过的问题,您可以在此处查看实现: https : //github.com/ChimeHQ/OperationPlus

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM