iOS NSURLSession的使用

iOS进行网络请求时,使用NSURLSession方法。

1NSURLSession主要结合NSURLNSURLRequestNSURLSessionDataTask使用

1-1NSURL用来设置网络请求的地址

1-2NSURLRequest用来设置url请求,以及设置请求时相关参数设置(如:缓存、超时等)

1-3NSURLSessionDataTask来设置数据请求

(2)NSURLSession既有代理方式,又有block代码块方式(无同步,或异步之分);

 

注意
(1)创建NSURLSession时的NSURLSessionConfiguration设置
一般模式(default):工作模式类似于原来的NSURLConnection,可以使用缓存的Cache,Cookie,鉴权。
及时模式(ephemeral):不使用缓存的Cache,Cookie,鉴权。
后台模式(background):在后台完成上传下载,创建Configuration对象的时候需要给一个NSString的ID用于追踪完成工作的Session是哪一个(后面会讲到)。
(2)Task有三种子类:
NSURLSessionUploadTask:上传用的Task,传完以后不会再下载返回结果;
NSURLSessionDownloadTask:下载用的Task;
NSURLSessionDataTask:可以上传内容,上传完成后再进行下载。


1、代理方式

1-1、添加协议

NSURLSessionDelegate

1-2、实例化等操作

// 创建NSURLSession
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:queue];
// 创建NSURLRequest
// 图片地址
// NSString *string = @"http://img4.imgtn.bdimg.com/it/u=819265564,3078214620&fm=206&gp=0.jpg";
// 天气地址
NSString *string = @"http://api.k780.com:88/?app=weather.future&weaid=1&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json";
string = [string stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; // 请求地址中包含中文时进行转换
NSURL *url = [NSURL URLWithString:string];
NSMutableURLRequest *mutableRequest = [[NSMutableURLRequest alloc] initWithURL:url];
// 缓存
mutableRequest.cachePolicy = NSURLRequestUseProtocolCachePolicy;
// 请求超时
mutableRequest.timeoutInterval = 30.0;
// 请求方式POST、或GET
// mutableRequest.HTTPMethod = @"POST";
mutableRequest.HTTPMethod = @"GET";
// 创建NSURLSessionDataTask
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:self.mutableRequest];

// 开始网络请求
[dataTask resume];
// 停止请求网络
[dataTask cancel];
  
// 取消/关闭NSURLSession
[session finishTasksAndInvalidate];

1-3、代理方法实现

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler
{
    NSLog(@"1 请求成功返回请求头信息 response = %@", response);
    
    // 让任务继续正常进行.(如果没有写这行代码, 将不会执行下面的代理方法.)
    completionHandler(NSURLSessionResponseAllow);
}

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
{
    NSLog(@"2 请求成功返回接收到的信息 data = %@", data);
    
    if (0 != data.length)
    {
        if (dataTask == self.dataTask)
        {
            [self.networkData appendData:data];
        }
        else if (dataTask == self.imageDataTask)
        {
            if (self.imageData == nil)
            {
                self.imageData = [[NSMutableData alloc] init];
            }
            [self.imageData appendData:data];
        }
    }
}

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
    NSLog(@"3 请求成功结束请求");

    NSString *result = [[NSString alloc] initWithData:self.networkData encoding:NSUTF8StringEncoding];
    NSLog(@"result = %@", result);

    if (task == self.dataTask)
    {
        self.networkDict = [NSJSONSerialization JSONObjectWithData:self.networkData options:NSJSONReadingMutableContainers error:nil];
        NSLog(@"resultDict = %@", self.networkDict);
        if (self.networkDict && 0 != self.networkDict.count)
        {
            [self.tableview reloadData];
        }
    }
    else if (task == self.imageDataTask)
    {
        UIImage *image = [UIImage imageWithData:self.imageData];
        self.imageview.image = image;
    }
}

- (void)URLSession:(NSURLSession *)session didBecomeInvalidWithError:(nullable NSError *)error
{
    NSLog(@"4 请求失败");
}


2、block代码块方式

// 创建NSURLSession
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration];
// 创建NSURLRequest
// 图片地址
// NSString *string = @"http://img4.imgtn.bdimg.com/it/u=819265564,3078214620&fm=206&gp=0.jpg";
// 天气地址
NSString *string = @"http://api.k780.com:88/?app=weather.future&weaid=1&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json";
string = [string stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; // 请求地址中包含中文时进行转换
NSURL *url = [NSURL URLWithString:string];
NSMutableURLRequest *mutableRequest = [[NSMutableURLRequest alloc] initWithURL:url];
// 缓存
mutableRequest.cachePolicy = NSURLRequestUseProtocolCachePolicy;
// 请求超时
mutableRequest.timeoutInterval = 30.0;
// 请求方式POST、或GET
// mutableRequest.HTTPMethod = @"POST";
mutableRequest.HTTPMethod = @"GET";
// 创建NSURLSessionDataTask
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest: mutableRequest completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        UIImage *image = [UIImage imageWithData:data];
        self.imageview.image = image;
}];

// 开始网络请求
[dataTask resume];
// 停止请求网络
[dataTask cancel];
  
// 取消/关闭NSURLSession
[session finishTasksAndInvalidate];





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

番薯大佬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值