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