我在测试中看到一个错误,偶尔会出现以下iOS错误:
已存在标识为{GUID}的后台URLSession!
即使我在每次测试后在清理调用中调用NSURLSession上的invalidateAndCancel。我正在寻找一种方法,等待我确定NSURLSession对象已经失效,然后再进行下一个测试。
在创建NSURLSession
对象时,请使用sessionWithConfiguration:(NSURLSessionConfiguration *)configuration delegate:(id <NSURLSessionDelegate>)delegate delegateQueue:(NSOperationQueue *)queue;
方法并将自己指定为委托。
然后,当会话失效时,您将在:- (void)URLSession:(NSURLSession *)session didBecomeInvalidWithError:(NSError *)error;
中获得回调。
您不能相信invalidateAndCancel
会立即停止所有任务,因为它取决于处理取消呼叫的任务。
从NSURLSession
的标题:
/* -invalidateAndCancel acts as -finishTasksAndInvalidate, but issues
* -cancel to all outstanding tasks for this session. Note task
* cancellation is subject to the state of the task, and some tasks may
* have already have completed at the time they are sent -cancel.
*/
苹果
“重要
会话对象保留对委托的强引用,直到您的应用退出或显式使会话无效。如果您没有使会话无效,那么您的应用程序会在内存泄漏之前泄漏内存。“
也许代表在无效会话中为零(如果您总是使用委托)。同意为什么会话中没有isValid调用?
最好手动取消所有任务,并为安全起见invalidateAndCancel()
self.session.getTasksWithCompletionHandler { (dataTasks: Array, uploadTasks: Array, downloadTasks: Array) in
for task in downloadTasks {
task.cancel()
}
self.session.invalidateAndCancel()
}