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することが出来ない。従って、無限ループを起こすことは出来ない