web-dev-qa-db-ja.com

NSURLSessionオブジェクトがiOSによって無効にされたことをどのようにして知ることができますか?

テストでエラーが発生し、次のiOSエラーが発生することがあります。

識別子{GUID}のバックグラウンドURLSessionはすでに存在します!

すべてのテストの後、クリーンアップ呼び出しでNSURLSessionでinvalidateAndCancelを呼び出しますが。次のテストに進む前に、NSURLSessionオブジェクトが無効になっていることを確認するまで待つ方法を探しています。

18
Spilly

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. 
*/
13
ABeanSits

Apple

"重要

セッションオブジェクトは、アプリが終了するか、セッションを明示的に無効にするまで、デリゲートへの強力な参照を保持します。セッションを無効にしないと、アプリが終了するまでメモリリークが発生します。」

おそらく、無効なセッションではデリゲートはゼロです(常にデリゲートを使用している場合)。セッションにisValid呼び出しがないのはなぜですか?

4
Tom Andersen

安全のためにすべてのタスクを手動でキャンセルし、invalidateAndCancel()を使用することをお勧めします

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

            } 
0
Nilesh