iOS精品文章iOS Collection网络请求

NSURLSession使用注意事项

2015-12-18  本文已影响3177人  fever105
Snip20151216_3.png

NSURLSession使用注意事项





/*
后台任务执行流程
*/

(app已退出)后台任务进行中--->

==================================

情况A:任务完成 / 需要验证证书--->

1. app代理方法application:handleEventsForBackgroundURLSession:completionHandler:被调用

2. 在其中所需执行的操作:
- 保存completionHandler 
- 根据identifier创建一个background configuration 
- 创建background session
--->

3. 后台任务被自动纳入新建session--->

4. 所有任务完成,session代理方法URLSessionDidFinishEventsForBackgroundURLSession:被调用--->

5. 执行之前保存的completionHandler(注意,其属于UIKit,必须在主线程上执行)

==================================

情况B:用户再次启动app--->

1. 在app代理方法application:didFinishLaunchingWithOptions:中根据identifier,创建仍有未完成任务的session对象(一个或多个)
--->

2. 后台任务被自动纳入新建session--->

/*
Session代理方法
*/
- (void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session
{
    NSLog(@"所有后台任务已经完成");
    
    if (session.configuration.identifier) {
        // 执行实现保存的后台session回调
        self.backgrondSessionCompletionHandler();
    }
}

======================================

/*
app代理方法
*/
- (void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier completionHandler:(void (^)())completionHandler
{
    // 创建配置对象
    NSURLSessionConfiguration *config = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:identifier];
    
    // 根据配置对象创建session
    NSURLSession *session = [NSURLSession sessionWithConfiguration:config delegate:self.sessionDelegate delegateQueue:[NSOperationQueue new]];
    
    NSLog(@"session被重新创建");
    
    // 保存completionHandler
    self.backgrondSessionCompletionHandler = completionHandler;
}



上一篇 下一篇

猜你喜欢

热点阅读