我在测试中发现错误,偶尔会出现以下iOS错误:
标识为{GUID}的后台网址已存在!
即使我在每次测试后在清理调用中调用NSURLSession上的invalidateAndCancel。我正在寻找一种方法,等待我确定NSURLSession对象已经失效,然后再进行下一次测试。
答案 0 :(得分:11)
创建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.
*/
答案 1 :(得分:4)
苹果
&#34;重要
会话对象保留对委托的强引用,直到你的 应用退出或明确使会话无效。如果你不 使会话无效,您的应用程序会泄漏内存,直到它退出。&#34;
也许代表在无效会话上是nil(如果你总是使用委托)。同意为什么会话中没有isValid调用?
答案 2 :(得分:0)
更好地手动取消所有任务,并为了安全起见将invalidateAndCancel()取消
self.session.getTasksWithCompletionHandler { (dataTasks: Array, uploadTasks: Array, downloadTasks: Array) in
for task in downloadTasks {
task.cancel()
}
self.session.invalidateAndCancel()
}