好东西小知识点

iOS网络相关

2017-06-05  本文已影响77人  勇往直前888

网络,常常和多线程搞混,以前想复杂了,其实采用最简洁的使用方式才是推荐的方式。

历史

大约在2012年左右的样子,关于iOS的网络第三方库,一般有三种观点

asi-http-request

MKNetworkKit

AFNetworking

当时的普遍说法是ASI已经停止更新;AF比较小,使用比较简单;MKASI的效率,接口和AF一样好用。
当时我所在的项目组选用的是MK,当然现在接触的项目,网络库基本上选择AFNetworking。这个基本上已经成为事实上的标准了。

另外一个比较相关的内容是图片的上传和下载。AFNetworking其实是有图片上传和下载相关的功能的,但是实际接触的项目中用的非常少。SDWebImage基本上成为图片上传下载的事实标准。

学习资料

iOS关于网络的API,一开始是NSURLConnection,当前,基本上已经过渡到NSURLSession,下面几篇文章都是不错的学习资料

iOS开发网络篇—发送GET和POST请求(使用NSURLSession)

NSURLSession使用说明及后台工作流程分析

iOS开发 GET、POST请求方法:NSURLSession篇

让iOS项目允许使用http协议请求

数据业务

如果采用AFNetworking的话,按照网上的教程来,比如iOS开发——AFNetworking框架使用详解,相对比较省心。
如果想自己尝试写的话,那么就要多考虑一些了。
数据业务应该是APP中使用最多的场景:
(1)从后台拿数据,显示页面;
(2)提交用户数据,提交后台处理,响应之后更新页面。

采用GET还是POST,或者两者都有?

- (void)getWithUrl {
    //1.确定请求路径
    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=520it&pwd=520it&type=JSON"];
    
    //2.获得会话对象
    NSURLSession *session = [NSURLSession sharedSession];
    
    //3.根据会话对象创建一个Task(发送请求)
    /*
     第一个参数:请求路径
     第二个参数:completionHandler回调(请求完成【成功|失败】的回调)
               data:响应体信息(期望的数据)
               response:响应头信息,主要是对服务器端的描述
               error:错误信息,如果请求失败,则error有值
     注意:
        1)该方法内部会自动将请求路径包装成一个请求对象,该请求对象默认包含了请求头信息和请求方法(GET)
        2)如果要发送的是POST请求,则不能使用该方法
     */
    NSURLSessionDataTask *dataTask = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        
        //5.解析数据
        NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
        NSLog(@"%@",dict);
        
    }];
    
    //4.执行任务
    [dataTask resume];
}
- (void)getWithURLRequest {
    //对请求路径的说明
    //http://120.25.226.186:32812/login?username=520it&pwd=520&type=JSON
    //协议头+主机地址+接口名称+?+参数1&参数2&参数3
    //协议头(http://)+主机地址(120.25.226.186:32812)+接口名称(login)+?+参数1(username=520it)&参数2(pwd=520)&参数3(type=JSON)
    //GET请求,直接把请求参数跟在URL的后面以?隔开,多个参数之间以&符号拼接
    
    //1.确定请求路径
    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=520it&pwd=520it&type=JSON"];
    
    //2.创建请求对象
    //请求对象内部默认已经包含了请求头和请求方法(GET)
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    
    //3.获得会话对象
    NSURLSession *session = [NSURLSession sharedSession];
      
    //4.根据会话对象创建一个Task(发送请求)
    /*
     第一个参数:请求对象
     第二个参数:completionHandler回调(请求完成【成功|失败】的回调)
               data:响应体信息(期望的数据)
               response:响应头信息,主要是对服务器端的描述
               error:错误信息,如果请求失败,则error有值
     */
    NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        
        if (error == nil) {
            //6.解析服务器返回的数据
            //说明:(此处返回的数据是JSON格式的,因此使用NSJSONSerialization进行反序列化处理)
            NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
            
            NSLog(@"%@",dict);
        }
    }];
    
    //5.执行任务
    [dataTask resume];
}

数据业务统一为POST是推荐做法。引入GET,反而要区分两种方式,更麻烦。另外,POST的安全性要比GET高一点。

回调方式采用delegate还是block?NSURLSession采用系统的单例还是自定义的?

结合需求场景,数据业务,采用系统默认的单例NSURLSession就可以了。采用NSURLSessionDataTaskblock回调方式。采用delegate方式过于复杂,没有必要

// 1.创建一个网络路径
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://172.16.2.254/php/phonelogin?yourname=%@&yourpas=%@&btn=login",yourname,yourpass]];
// 2.创建一个网络请求
NSURLRequest *request =[NSURLRequest requestWithURL:url];
// 3.获得会话对象
NSURLSession *session = [NSURLSession sharedSession];
// 4.根据会话对象,创建一个Task任务:
NSURLSessionDataTask *sessionDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        NSLog(@"从服务器获取到数据");
         /*
           对从服务器获取到的数据data进行相应的处理:
         */        NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:(NSJSONReadingMutableLeaves) error:nil];
 }];
// 5.最后一步,执行任务(resume也是继续执行):
[sessionDataTask resume];

下载业务

下载业务采用自定的NSURLSession,不用系统的单例。采用delegate方式,不用block方式。模式仍然采用默认的,不考虑及时模式和背景模式。使用NSURLSessionDownloadTask

图片上传和下载

图片的上传下载,看做是普通数据业务,也采用NSURLSessionDataTask。使用block的方式,没有必要采用delegate。不需要考虑NSURLSessionUploadTaskNSURLSessionDownloadTask

上传业务

这个遇到的比较少,可以暂时不考虑。当然,想百度网盘那种应用,这个是重点了。一般情况,不需要考虑NSURLSessionUploadTask这种场景。

小结

上一篇 下一篇

猜你喜欢

热点阅读