テストでエラーが発生し、次の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.
*/
Apple
"重要
セッションオブジェクトは、アプリが終了するか、セッションを明示的に無効にするまで、デリゲートへの強力な参照を保持します。セッションを無効にしないと、アプリが終了するまでメモリリークが発生します。」
おそらく、無効なセッションではデリゲートはゼロです(常にデリゲートを使用している場合)。セッションにisValid呼び出しがないのはなぜですか?
安全のためにすべてのタスクを手動でキャンセルし、invalidateAndCancel()を使用することをお勧めします
self.session.getTasksWithCompletionHandler { (dataTasks: Array, uploadTasks: Array, downloadTasks: Array) in
for task in downloadTasks {
task.cancel()
}
self.session.invalidateAndCancel()
}