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

问题描述 投票:15回答:3

我在测试中看到一个错误,偶尔会出现以下iOS错误:

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

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

ios nsurlsession
3个回答
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. 
*/

4
投票

苹果

“重要

会话对象保留对委托的强引用,直到您的应用退出或显式使会话无效。如果您没有使会话无效,那么您的应用程序会在内存泄漏之前泄漏内存。“

也许代表在无效会话中为零(如果您总是使用委托)。同意为什么会话中没有isValid调用?


0
投票

最好手动取消所有任务,并为安全起见invalidateAndCancel()

self.session.getTasksWithCompletionHandler { (dataTasks: Array, uploadTasks: Array, downloadTasks: Array) in
                for task in downloadTasks {
                    task.cancel()
                }
                self.session.invalidateAndCancel()

            } 
© www.soinside.com 2019 - 2024. All rights reserved.