zoukankan      html  css  js  c++  java
  • 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的方法不适用多个大型文件的下载。

  • 相关阅读:
    Hbase学习记录(2)| Shell操作
    Hbase学习记录(1)|伪分布式安装
    Zookeeper集群安装详解
    防范xss的正确姿势
    怎么样通过编写Python小程序来统计测试脚本的关键字
    XSS报警机制(前端防火墙:第二篇)
    XSS姿势——文件上传XSS
    MySQL防范SQL注入风险
    SQL注入—我是如何一步步攻破一家互联网公司的
    通过BurpSuite和sqlmap配合对dvwa进行sql注入测试和用户名密码暴力破解
  • 原文地址:https://www.cnblogs.com/breezemist/p/4288162.html
Copyright © 2011-2022 走看看