NSURLSession
: OS の NSURLSession Daemon とのコネクションを管理するインスタンス。大体アプリにつき一つ。Singleton で OK. Delegate はこいつに紐づく。NSURLSessionTask
: 「リクエスト一つ」に対応。ただし OS 直属の NSURLSession Daemon に管理が委ねられる。
NSURLSession
を初期化NSURLSessionTask
を上記インスタンスから生成し、- resume
する- App が Active のとき、各イベント毎に
NSURLSession
に紐づく Delegate が呼出される。
- URLSession:downloadTask:didFinishDownloadingToURL:
だけは呼出される。
- App が Non Active ならば、
NSURLSession
に紐づく Task が全て終わったとき。
AppDelegate
の- application:handleEventsForBackgroundURLSession:completionHandler:
が呼出される。NSURLSession
の Delegate は呼出されない。 (> The app calls this method when all background transfers associated with an NSURLSession object are done) https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIApplicationDelegate_Protocol/#//apple_ref/occ/intfm/UIApplicationDelegate/application:handleEventsForBackgroundURLSession:completionHandler:- この後、アプリを Active にするとその瞬間に、
NSURLSession
の Delegate の- URLSessionDidFinishEventsForBackgroundURLSession:
が呼出される(これは、「前回開始していたリクエスト」が完了したことをハンドリングするためのポイントっぽい。)
NSURLSessionConfiguration + backgroundSessionConfigurationWithIdentifier:
はcompletionHandler
に対応していない- リクエスト毎の
completionHandler
でのコールバック受けが出来ない。NSURLSession
の Delegate で対応。
- リクエスト毎の
- App が Non Active の時呼び出される
- URLSession:downloadTask:didFinishDownloadingToURL:
内でNSURLSessionTask
をresume
することが出来ない。従って、無限ループを起こすことは出来ない