iOS网络编程

2018-06-01  本文已影响128人  小芳姑娘2012

iOS网络相关类介绍

网络请求地址对象——NSURL

url 介绍

  • url的符语法: 协议://授权/路径?查询
  • 协议: ftp://(文件传输协议) http://(超⽂本传输协议) https://(安全超文本传输协议) file://(本地文件协议)

url作为网址字符串包含很多请求参数,NSURL对网址字符串进行封装, 可以使用NSURL对象获取相应的参数。


image.png

absoluteString : http://lily:123456@www.google.com/search? hl=en&source=hp&q=mysql&aq=f&oq=&aqi=g10#page
scheme: http
host: www.google.com
user: lily
password: 123456
port: 8080
query: hl=en&source=hp&q=mysql&aq=f&oq=&aqi=g10

网络请求对象 ——NSURLRequest,NSMultableRequest

可以使用URL加载一个请求,设置请求方法HTTPMethodPOST等,设置请求体HTTPBody网络请求的参数,并且可以设置缓存策略,请求等待时间。
初始化方法:
- (instancetype)initWithURL:(NSURL *)URL;
- (instancetype)initWithURL:(NSURL *)URL cachePolicy:(NSURLRequestCachePolicy)cachePolicy timeoutInterval:(NSTimeInterval)timeoutInterval NS_DESIGNATED_INITIALIZER;

网络连接对象—— NSURLSession

NSURLConnectioniOS9之后 弃用,使用NSURLSession代替。NSURLSession提供了NSURLRequest对象的网络机制的策略配置NSURLSessionConfiguration。NSURLSession可以设置代理NSURLSessionDelegate,代理方法会在网络请求的生命周期中调用, 参考文档

NSURLSessionConfiguration

创建session会话时生成configuration对象的副本,会话创建后不能修改会话的configuration。

NSURLSession的子类

NSURLSession是一个抽象类,会创建子类实现具体操作,获取数据和下载、上传文件的实际工作,调用resume方法。就像名字的意思,NSURLSession创建一个会话,它的子类Task执行任务。

网络链接协议——NSURLSessionDelegate

tasks共享一个代理,代理响应各种事件,提供和获取信息,当身份验证失败时,当服务器的数据到达时,当数据准备缓存时等等,逐步地列出回话执行任务时发生的事件以及 调用哪个委托方法。

NSURLSessionDelegate 处理会话事件代理

NSURLSessionTaskDelegate 通用代理

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(nullable NSError *)error; 请求结束或者是失败的时候调用

NSURLSessionDataDelegate 数据任务

#pragma mark - NSURLSessionDataDelegate
// 使用block方式初始化task的话设置的代理方法将无效
/**
 * 接收到服务器的响应 它默认会取消该请求
 *
 *  @param session           会话对象
 *  @param dataTask          请求任务
 *  @param response          响应头信息
 *  @param completionHandler 回调 传给系统
 */
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(nonnull NSURLResponse *)response completionHandler:(nonnull void (^)(NSURLSessionResponseDisposition))completionHandler {
    
    /*
     NSURLSessionResponseCancel = 0,取消 默认
     NSURLSessionResponseAllow = 1, 接收
     NSURLSessionResponseBecomeDownload = 2, 变成下载任务
     NSURLSessionResponseBecomeStream        变成流
     */
    completionHandler(NSURLSessionResponseAllow);
}
//接收到服务器的响应 调用多次
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data {
    
}

NSURLSessionDownloadDelegate下载

#pragma mark - NSURLSessionDownloadDelegate
- (void)URLSession:(NSURLSession *)session downloadTask:(nonnull NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite {
    
}
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
didFinishDownloadingToURL:(NSURL *)location {
    
}
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes {
    
}

NSURLSessionStreamDelegate

NSURLSessionDataDelegate, NSURLSessionDownloadDelegate,NSURLSessionStreamDelegate 三个代理都是继承自NSURLSessionTaskDelegate的代理,NSURLSessionTaskDelegate继承自NSURLSessionDelegate

网络请求数据信息——NSURLResponse

请求方式

连接方式

使用NSURLSession进行网络请求步骤

基本类介绍完来看一下具体使用。
1 创建一个session,创建session时指定sessionconfig
2 由session创建子类task
3 task调用resume方法,请求网络

    NSURLSession *session = [NSURLSession sessionWithConfiguration:config];
    NSURL *url = [NSURL URLWithString:@"http://xxx.34.43.000:8000/login"];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    request.HTTPMethod = @"POST";
    NSDictionary *dic = @{
                            @"biz":@{
                                    @"username":@"xxff",
                                    @"device_id" : @"d41d8cd98f00b204e9800998ecf8427e",
                                    @"password" : @"xxxxx"

                                    },
                           
                    };
    NSData *paramData = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:nil];
    NSString *paramStr = [[NSString alloc] initWithData:paramData encoding:NSUTF8StringEncoding];
    paramStr = [NSString stringWithFormat:@"xmas-json=%@", paramStr];
    request.HTTPBody = [paramStr dataUsingEncoding:NSUTF8StringEncoding];
    
    NSURLSessionDataTask *sessionDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        
        if (error) {
            NSLog(@"222Error: %@", error);
        } else {
            NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
            NSLog(@"11%@", dict);
        }
    }];
    [sessionDataTask resume];

各个子类对应不同的使用场景创建方法可以参考API。如果使用block回调创建task,那么设置的代理将无效。

上一篇 下一篇

猜你喜欢

热点阅读