你怎么知道NSURLSession对象何时被iOS无效?

时间:2014-01-28 19:21:26

标签: ios nsurlsession

我在测试中发现错误,偶尔会出现以下iOS错误:

标识为{GUID}的后台网址已存在!

即使我在每次测试后在清理调用中调用NSURLSession上的invalidateAndCancel。我正在寻找一种方法,等待我确定NSURLSession对象已经失效,然后再进行下一次测试。

3 个答案:

答案 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()

            }