zoukankan      html  css  js  c++  java
  • NSURLConnection发送Get网络请求

    //
    //  ViewController.m
    //  NSURLConnection使用
    //
    //  Created by 李圣培 on 2019/3/15.
    //  Copyright © 2019年 李圣培. All rights reserved.
    //
    
    #import "ViewController.h"
    
    @interface ViewController ()<NSURLConnectionDataDelegate>
    
    @property (nonatomic, strong) NSMutableData   *totalData;
    
    @end
    
    @implementation ViewController
    
    -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
    {
        
    //    [self getYahooData];//同步请求,会阻塞主线程
    //    [self getYahooData_GCD];//使用GCD把同步请求放在子线程中,也不会阻塞主线程
    //    [self getYahooData_Async];//直接使用异步请求,不会阻塞主线程
          [self getYahooData_delegate];
    }
    
    -(NSMutableData *)totalData
    {
        if (_totalData == nil) {
            _totalData = [[NSMutableData alloc]init];
        }
        return _totalData;
    }
    
    -(void)getYahooData_Async
    {
        NSLog(@"异步请求测试开始...");
        NSURL *url = [NSURL URLWithString:@"http://www.yahoo.com"];
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
        
        NSLog(@"马上进行异步连接请求url的数据");
        [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue currentQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {//[NSOperationQueue currentQueue]决定block在哪个队列执行
            
            if (data.length > 0 && connectionError == nil) {
                NSLog(@"%lu字节的数据被返回",(unsigned long)data.length);
            }else if (connectionError == nil && data.length == 0)
            {
                NSLog(@"没有数据返回。。");
            }else if (connectionError != nil)
            {
                NSLog(@"返回错误");
            }
        }];
        NSLog(@"异步请求测试完成。。");
    }
    
    -(void)getYahooData_GCD
    {
        NSLog(@"异步请求测试开始...");
        NSURL *url = [NSURL URLWithString:@"http://www.yahoo.com"];
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
        
        NSLog(@"马上进行异步连接请求url的数据");
        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        dispatch_async(queue, ^{
            
            NSURLResponse *response = nil;
            NSError *error = nil;
           
            NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
            
            if (data.length > 0 && error == nil) {
                NSLog(@"%lu字节的数据被返回",(unsigned long)data.length);
            }else if (error == nil && data.length == 0)
            {
                NSLog(@"没有数据返回。。");
            }else if (error != nil)
            {
                NSLog(@"返回错误");
            }
        });
        
        NSLog(@"GCD测试完成。。");
    }
    
    -(void)getYahooData
    {//同步请求,会阻塞主线程
        NSLog(@"同步请求测试开始...");
        NSURL *url = [NSURL URLWithString:@"http://www.yahoo.com"];
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
        
        NSURLResponse *response = nil;
        NSError *error = nil;
        
        NSLog(@"马上进行同步连接请求url的数据");
        NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
        
        if (data.length > 0 && error == nil) {
            NSLog(@"%lu字节的数据被返回",(unsigned long)data.length);
        }else if (error == nil && data.length == 0)
        {
            NSLog(@"没有数据返回。。");
        }else if (error != nil)
        {
            NSLog(@"返回错误");
        }
        NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);
        
    }
    
    -(void)getYahooData_delegate
    {
        NSURL *url = [NSURL URLWithString:@"http://www.yahoo.com"];
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
        
        NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:request delegate:self];
        
        //如果使用这个方法startImmediately设置为NO,则需要手动调用start开启网络请求。
    //    NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:request delegate:self startImmediately:NO];
    //    [connection start];
        
    //    [connection cancel];请求取消
    }
    
    #pragma mark NSURLConnectionDataDelegate
    
    - (NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(nullable NSURLResponse *)response
    {
        return request;
    }
    - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
    {//接收到服务器的响应
        
    }
    
    - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
    {//接收到服务返回的数据, 可能会调用多次,在这里拼接数据
        [self.totalData appendData:data];
        NSLog(@"-----totalData Length: %lu",_totalData.length);
    }
    
    - (void)connection:(NSURLConnection *)connection   didSendBodyData:(NSInteger)bytesWritten
     totalBytesWritten:(NSInteger)totalBytesWritten totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite
    {
        
    }
    
    - (nullable NSCachedURLResponse *)connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse
    {
        NSLog(@"%@",cachedResponse);
        return cachedResponse;
    }
    
    - (void)connectionDidFinishLoading:(NSURLConnection *)connection
    {//请求完成时调用
        NSLog(@"connectionDidFinishLoading");
        
        NSLog(@"totalData Length: %lu",self.totalData.length);
        NSLog(@"%@",[[NSString alloc]initWithData:self.totalData encoding:NSUTF8StringEncoding]);
    }
    
    @end
  • 相关阅读:
    idea 设置默认的maven
    IDEA中Tomcat部署时war和war exploded区别
    所谓的SaaS服务到底是什么?
    java8 Lambda表达式
    java8 :: 用法 (JDK8 双冒号用法)
    idea 本地调试,修改代码,代码自动生效
    nacos配置中心demo
    Logparser 的用法
    android软键盘的一些控制 转来的,格式有点乱
    TranslateAnimation 使用详解
  • 原文地址:https://www.cnblogs.com/dashengios/p/10536322.html
Copyright © 2011-2022 走看看