• 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的方法不适用多个大型文件的下载。

  • 相关阅读:
    不能以根用户身份运行 Google Chrome 浏览器
    Ubuntu 10.04 10.10 11.04 9.10 9.04 中文字体美化——安装雅黑字体
    笔记一:文本属性
    ubuntu下使用 android adb命令
    css常用技巧
    PHP max_execution_time 超时
    PHP判断文件夹是否存在和创建文件夹的方法
    javascript之HTML(select option)详解
    查询HTML标签select中options的值并定位其位置
    PHP网页进度条
  • 原文地址:https://www.cnblogs.com/breezemist/p/4288162.html
Copyright © 2020-2023  润新知