iOS 串行网络请求。。。待研究

nsurlsession 和 nsurlconnection 能实现吗? 手动实现的关键点在哪里?

我这里说的串行网络请求,指的是第一个网络请求不返回数据,第二个网络请求就不能开始。

AFNetworking 使用NSUrlConnection 系列函数实现串行网络请求的方法如下,本质是在AFURLConnectionOperation实现了响应方法,让网络请求内容返回后,再结束Operation,这样就实现了我们想要的串行请求。不用AFHTTPRequestOperationManager也是可以的,但是要自己建立一个queue.

  AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
        
  manager.operationQueue.maxConcurrentOperationCount = 1;

 

AFNetworking中用NSUrlSession实现的方法就没有上面那么好用的串行下载方法了,虽然在代码中有以下code

[NSURLSession sessionWithConfiguration:self.sessionConfiguration delegate:self delegateQueue:self.operationQueue];

这里也有一个quque,但是这个queue是NSURLSession的delegate的回调方法的queue,这个queue的

maxConcurrentOperationCount已经被赋值为1,目的是串行地处理各个task的delegate的回调,而不是串行地下载,几个task可能在同时下载,至于到底是几个在同时下载,应该是由系统看情况自动处理的。比如有以下代码:

 NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
    
    NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration];
    
    for(int i = 0;i<20;i++){
        NSURLSessionDownloadTask *task2 = [session downloadTaskWithURL:[NSURL URLWithString:@"http://www.baidu.com"] completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {
            
            NSLog(@"current thread is %@",[NSThread currentThread]);
            NSLog(@"==================================%d",i);
            
            for(int i=0;i<200;i++){
                NSLog(@"%d",i);
            };
        }];
        
        [task2 resume];
    }

那么 20个请求会同时发出,响应也被同时得到了,但是处理数据的回调的block是串行执行的(这是因为不指定queue的话,系统会自动建立一个serial queue)!

顺便看一下网络请求的截图印证一下:

 

 

如果我们的请求都来自一个host,也可以用

 NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
 configuration.HTTPMaximumConnectionsPerHost = 1;

方法来实现我们想要的串行下载,但是注意,如果等待时间过长,(具体时间是多少???),这种方法可能产生网络超时的错误!所以这个设定HTTPMaximumConnectionsPerHost的方法不适用多个大型文件的下载。

 

posted @ 2015-02-12 15:10  幻化成疯  阅读(2025)  评论(0编辑  收藏  举报