[英]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 还实现了URLSessionDataDelegate
和URLSessionTaskDelegate
以及它自己的 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.