zoukankan      html  css  js  c++  java
  • iOS网络: NSURLConnection进行同步下载

      通过 NSURLConnection 的 sendSynchronousRequest:returningResponse:error: 方法创建一 个同步的网络连接。这个方法将会返回一个 NSData 类型的数据 
     
      在创建一个同步的网络连接的时候我们需要明白一点,并不是是我们 的这个同步连接一定会堵塞我们的主线程,如果这个同步的连接是创建在主线程上的,那么 这种情况下是会堵塞我们的主线程的,其他的情况下是不一定会堵塞我们的主线程的。如果你在 GCD 的全局并发队列上初始化了一个同步的连接,你其实并不会堵塞我们的主线程的。 

    例子:

    - (void)sendSynNetwork{
        NSLog(@"Wo are here...");
        NSString *urlString = @"http://www.baudu.com";
        NSURL *url = [NSURL URLWithString:urlString];
        NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10.0f];
        //同步没有block
        //这样解决比较方便
        NSURLResponse *response = nil;
        NSError *error = nil;
        NSLog(@"开始同步请求");
        NSData *data = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&response error:&error];
        if ([data length] > 0 && error == nil){
            NSLog(@"%lu bytes of data was returned.", (unsigned long)[data length]); }
        else if ([data length] == 0 && error == nil){
            NSLog(@"No data was returned.");
        }
        else if (error != nil){
            NSLog(@"Error happened = %@", error);
        }
        NSLog(@"We are done.");
    }

    Wo are here...

    开始同步请求

    8875 bytes of data was returned.

    We are done.

     
    通过上面的代码我们不难发现,其实我们的主线程是一直堵塞着,也就是说段代码是一行一行执行的。
     
    下面让我们看一下,当我们创建一个同步的连接,并且添加到 GCD 的队列池中去,我们又会发现什么: 
    //简单的同步请求
    - (void)sendSynNetwork{
        NSLog(@"Wo are here...");
        NSString *urlString = @"http://www.baudu.com";
        NSURL *url = [NSURL URLWithString:urlString];
        NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10.0f];
        dispatch_queue_t dispatchQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        dispatch_async(dispatchQueue, ^{
            //同步没有block
    
            //这样解决比较方便
            NSURLResponse *response = nil;
            NSError *error = nil;
            NSLog(@"开始同步请求");
            NSData *data = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&response error:&error];
            if ([data length] > 0 && error == nil){
                NSLog(@"%lu bytes of data was returned.", (unsigned long)[data length]); }
            else if ([data length] == 0 && error == nil){
                NSLog(@"No data was returned.");
            }
            else if (error != nil){
                NSLog(@"Error happened = %@", error);
            }
            
        });
       NSLog(@"We are done.");
    }

    Wo are here...

    We are done.

    开始同步请求

    9138 bytes of data was returned.

     

     

  • 相关阅读:
    解决 Windows Server 2008 R2 上 Windows Update 无法失败,提示 8024402F
    【UWP】实现 FindAncestor 绑定
    实现在 .net 中使用 HttpClient 下载文件时显示进度
    【UWP】手动实现 WebAuthenticationBroker
    记录使用 Cake 进行构建并制作 nuget 包
    w筛选系数=(1+错次)/(1+总次)
    WZP身份溯源策略(World Zero Protection),宜分宜合、自主可控的实名认证体系
    WZP报文封装协议(Web Zip Protocol),安全可嵌套的传输协议
    WZP安全配置方案,针对通讯技术的安全措施
    WZP网络结构模型,对OSI参考模型和TCP/IP模型的改进
  • 原文地址:https://www.cnblogs.com/safiri/p/4089096.html
Copyright © 2011-2022 走看看