中山大学数据科学与计算机学院本科生实验报告
(2019年春季学期)
一、实验题目
IOS 网络访问
二、实现内容
- 学习第三⽅框架AFNetWorking
三、实验结果
1. 初步认识AFNetWorking
在线文档查询http://cocoadocs.org/docsets/AFNetworking/1.3.0/
里面详细的说明了其中多个类的使用方法,并带有demo演示
- AFNetworking是一个轻量级的网络请求API类库。是以
NSURLConnection
,NSOperation
和其他方法为基础的。 - 它拥有良好的架构,丰富的api,以及模块化构建方式,使得使用起来非常轻松。
功能
AFURLConnectionOperation
: 继承自NSOperation 实现了NSURLConnection 的代理方法。AFHTTPRequestOperation
: 继承自AFURLConnectionOperation的子类,当request请求使用的协议为HTTP和HTTPS时使用,它封装了用于 决定request是否成功的状态码和内容类型。AFJSONRequestOperation
: 继承自AFHTTPRequestOperation,用于下载和处理json response数据。AFXMLRequestOperation
: 继承自 AFHTTPRequestOperation,用于下载和处理xml response数据。AFPropertyListRequestOperation
: 继承自 AFHTTPRequestOperation,用于下载和处理 property list response数据。AFHTTPClient
:是一个封装了基于http协议的网络应用程序的公共交流模式。
2. 简单使用例子
// 定义一个url
NSURL *url = [NSURL URLWithString:@"https://alpha-api.app.net/stream/0/posts/stream/global"];
// 创建一个request请求
NSURLRequest *request = [NSURLRequest requestWithURL:url];
// 创建一个AFJSONRequestOperation
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
NSLog(@"App.net Global Stream: %@", JSON);
} failure:nil];
// 执行操作
[operation start];
这个是官网给的例子,代码的思路也比较简洁,通过四步就可以简单的能从网络上获取一个json文件,而且这个操作可以对正确执行来设计函数,也可以对操作失败后的错误处理进行设计函数。
- 定义一个url
- 创建一个request请求
- 创建一个AFJSONRequestOperation
- 添加执行操作success后的动作
- 添加执行操作failure后的动作
- 执行操作
3.网络访问日常操作
这里根据这个框架来记录一些平常我们在网络访问时候所要实现的需求
a. 获取网络图片并显示在我们的页面当中
异步获取图片,通过队列实现。且图片会有缓存,在下次请求相同的链接时,系统会自动调用缓存,而不从网上请求数据。
-
方法一
通过UIImageView本身的setImageWithURL来获取网络图片
UIImageView *imageView = [[UIImageView alloc]
initWithFrame:CGRectMake(0.0f, 100.0f, 100.0f, 100.0f)];
[imageView setImageWithURL:
[NSURL URLWithString:@"http://i.imgur.com/r4uwx.jpg"]
placeholderImage:
[UIImage imageNamed:@"placeholder-avatar"]];
[self.view addSubview:imageView];
-
方法二
这个就是用AFNetWorking的方法来进行网络访问获取
// 定义一个request请求
NSURLRequest *request = [NSURLRequest requestWithURL:
[NSURL URLWithString:@"http://www.scott-sherwood.com/wp-content/uploads/2013/01/scene.png"]];
// 定义图像获取的操作,并设定获取成功的动作以及获取失败的动作
AFImageRequestOperation *operation = [AFImageRequestOperation imageRequestOperationWithRequest:request imageProcessingBlock:nil
success:^(NSURLRequest *request, NSHTTPURLResponse*response, UIImage *image) {
self.backgroundImageView.image = image;
}
failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {
NSLog(@"Error %@",error);
}];
// 执行操作
[operation start];
b. 实现get请求与post请求
// 定义url
NSString *urlString = @"http://www.baidu.com";
// 定义一个AFHTTPSessionManager
AFHTTPSessionManager *manger =[AFHTTPSessionManager manager];
// 操作AFHTTPSessionManager来执行get请求
[manger GET:urlString parameters:nil
progress:^(NSProgress * _Nonnull downloadProgress) {
}
success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"成功");
}
failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"%@",error);
}];
实现get请求只需要三步
- 定义url
- 定义一个AFHTTPSessionManager
- 操作AFHTTPSessionManager来执行get请求
其核心的思想就是这个AFHTTPSessionManager,它封装好了get请求的方法,调用的过程还可以填写progress,success,failure等回调函数,做到比较简单的进行完整的网络访问,下面的post的请求也是类似的操作,只不过增加了数据的传输罢了。
// 定义url
NSString *urlString = @"http://172.0.0.1:8080";
// 定义AFHTTPSessionManager
AFHTTPSessionManager *manger =[AFHTTPSessionManager manager];
// 定义所需要传输的数据
NSMutableDictionary *parameter= @{@"hello":@"world",@"ios":@"android"};
// 执行post
[manger POST:urlString parameters:parameter
progress:^(NSProgress * _NonnulluploadProgress){
}
success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"成功");
}
failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"%@",error);
}];
c.查看网络状态
我们有时需要查看当前手机的网络状态来处理不同的事件,例如提示用户打开蜂窝网络,打开wifi等操作,这时查看网络状态就非常关键了。
// 创建一个网络监测者AFNetworkReachabilityManager
AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
// 监测网络的变化状态
switch (status) {
case AFNetworkReachabilityStatusUnknown:
NSLog(@"未知网络状态");
break;
case AFNetworkReachabilityStatusNotReachable:
NSLog(@"无网络");
break;
case AFNetworkReachabilityStatusReachableViaWWAN:
NSLog(@"蜂窝数据网络");
break;
case AFNetworkReachabilityStatusReachableViaWiFi:
NSLog(@"WiFi网络");
break;
default:
break;
}
}];
d.下载文件,即download请求;上传文件,即upload请求
// 创建NSURLSessionConfiguration
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
// 创建管理者对象AFURLSessionManager
AFURLSessionManager *manager = [[AFURLSessionManager alloc]initWithSessionConfiguration:configuration];
// 定义一个url
NSURL *url = [NSURL URLWithString:@"http://127.0.0.1/test.mp4"];
// 创建请求对象
NSURLRequest *request = [NSURLRequest requestWithURL:url];
// 下载任务
NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request
progress:^(NSProgress * _Nonnull downloadProgress) {
// 打印下载进度
NSLog(@"%lf",1.0*downloadProgress.completedUnitCount/downloadProgress.totalUnitCount);
}
destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
// 设置下载路径
NSURL *documentsDirectoryURL = [[NSFileManager defaultManager]URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil];
return [documentsDirectoryURL URLByAppendingPathComponent:[response suggestedFilename]];
} completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
// 下载完成的提示
NSLog(@"File downloaded to : %@",filePath);
}];
// 启动任务
[downloadTask resume];
下载一个文件需要以下一些操作
- 创建NSURLSessionConfiguration
- 创建管理者对象AFURLSessionManager
- 定义一个url
- 创建请求对象
- 通过manager来执行download下载任务
- progress打印下载进度
- destination设置下载路径
- completionHandler下载完成的提示
- 启动任务
//创建NSURLSessionConfiguration
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
//创建管理者对象
AFURLSessionManager *manager = [[AFURLSessionManager alloc]initWithSessionConfiguration:configuration];
//设置url
NSURL *url = [NSURL URLWithString:@"http://127.0.0.1"];
//创建请求对象
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//文件路径
NSURL *filePath = [NSURL fileURLWithPath:@"file://Users/Liu/Desktop/Note"];
//上传任务
NSURLSessionUploadTask *uploadTask = [manager uploadTaskWithRequest:request
fromFile:filePath
progress:nil
completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) {
if(error){
//错误
NSLog(@"Error:%@",error);
}else{
//成功
NSLog(@"Success %@ %@",response,responseObject);
}
}];
//启动任务
[uploadTask resume];
上传一个文件需要以下一些操作
- 创建NSURLSessionConfiguration
- 创建管理者对象AFURLSessionManager
- 定义一个url
- 确定上传的路径方便后面来获取文件
- 创建请求对象
- 通过manager来执行download下载任务
- progress打印上传进度
- completionHandler上传完成的提示
- 启动任务
四、实验思考及感想
本周由于清明假期,周末没有上课讲授新的内容,但是学习IOS的步伐是不能停下的,于是我回顾了一下之前的知识点,发现有一个开源组件没有深入了解,于是趁着本周的一点空余时间了解一下这个网络访问框架AFNetWorking,学习其用法。通过编写一些demo可以发现使用这个框架并不困难,api非常简单明了,主要的操作就是采用其中的manager来执行不同的操作,例如get,post等常用的方法。并且该框架提供了多个处理请求结果的接口,包括对上传过程,或者上传结束结果是否成功等。更加厉害的是其对于json,xml的转换也非常方便,可以简单的通过几行代码完成从获取到转码的过程。本周主要还是多了解网络访问这一块,因为上一学期的安卓期末项目就是与网络访问相关,当时对于安卓的网络访问也查了很多的资料。这周通过对该框架的学习,并且比对两边的异同来深入理解网络访问,下一个小目标是往该框架的源码实现过程里面钻,现在看起来还是有点困难的,不太熟悉,假以时日多学几个项目回来看源码估计会事半功倍!