// // 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