AFNetworking讲解

  1 #import "ViewController.h"
  2 //#import "AFNetworking/AFNetworking.h"
  3 #import "AFNetworking.h"
  4 
  5 @interface ViewController () {
  6     //进度条
  7     UIProgressView *_progressView;
  8 }
  9 
 10 @end
 11 
 12 @implementation ViewController
 13 
 14 - (void)viewDidLoad {
 15     [super viewDidLoad];
 16 
 17 
 18     /*
 19      数据请求方法
 20      NSURLConnection 系统自带的 常用的网络请求方式
 21      NSURLSession 系统自带的,iOS7.0版本之后出现的,它使用了Block,所以提高了开发效率
 22      AFNetworking 第三方的 目前很多公司经常使用这个第三方,内部集成了NSURLConnection和NSURLSession 环境是ARC,也使用了Block 提高了开发效率,并且不用系统库支持
 23      ASIHttpRequest 第三方 原来经常使用的数据请求库 缺点就是:环境需要MRC,并且没有使用Block,需要进行ARC和MRC之间的转换(混编) 优点:ASI这个第三方库已经没有开发维护,比较成熟,比较稳定,很多开发者对ASI进行了一次Block网络层封装然后调用使用。
 24      
 25      */
 26     
 27     /*
 28      Get请求和Post请求
 29      1.一般get是从服务器上获取数据,post是向服务器传送数据
 30      2.get是把参数列表加到提交表单中的ACTION属性中,值和表单内容各个字段一一对应,在我们的URL中可以看到。POST请求是通过HTTP post机制,将表单的各个字段和其他的内容设置到Html Header里一起传送到ACTION属性指定的URL地址。(说白了用户无法看到此过程)
 31      3.对应的get方式,传送的数据比较小,不能大于2KB.post方式传送的数据比较大,一般被默认为不受限制。但是理论上,IIS4中最大的数据量为80KB II5最大的数据量为100KB
 32      4.get安全性非常低,post安全性非常高。但是执行效率get比post要好
 33      
 34      建议:
 35      get方式安全性比post差,所以建议用post方式提交数据
 36      在做数据查询的时候,建议用get方式,而在做数据的添加、修改或删除的时候,建议post方式
 37     
 38      易语言   汉字 大连人
 39      
 40      */
 41     
 42 //    [self testGet];
 43     
 44 
 45 //    [self testPost];
 46     
 47     
 48 //    [self testNetState];
 49     
 50     //创建进度条
 51     _progressView = [[UIProgressView alloc] initWithProgressViewStyle:UIProgressViewStyleBar];
 52     //进度条高度不会影响_progressview
 53     _progressView.frame = CGRectMake(10, 100, 300, 20);
 54     _progressView.backgroundColor = [UIColor grayColor];
 55     
 56     [self.view addSubview:_progressView];
 57     
 58     
 59     [self testDownload];
 60     
 61 }
 62 
 63 //5.数据下载
 64 - (void)testDownload {
 65     //网址
 66     NSString *path = @"http://qiteacher.local/share/1.mp4";
 67     
 68     //创建下载的管理者 或者说url会话管理 参数固定写默认配置参数
 69     AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
 70     
 71     //下载任务
 72     NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:path]] progress:^(NSProgress * _Nonnull downloadProgress) {
 73         
 74         //KVO :Key Value Obeserver  观察对象的属性 如果属性值发生了变化 会根据变化响应不同的方法
 75         //键值观察者
 76         
 77         //监听(观察)downloadProgress这个对象的fractionCompleted这个属性
 78         //如果这个属性 新值和旧值不一样就会响应观察者的方法
 79         
 80         [downloadProgress addObserver:self forKeyPath:@"fractionCompleted" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
 81         
 82         
 83         
 84     } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
 85         //存放具体路径
 86         NSString *path = [NSString stringWithFormat:@"%@/Documents/1.mp4",NSHomeDirectory()];
 87         NSLog(@"%@",path);
 88         //将上面拼接的沙盒路径转换成NSURL类型
 89         return [NSURL fileURLWithPath:path];
 90         
 91     } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
 92         //完成的Block 不管下载成功与否,都会执行到这个block里面
 93         
 94         NSLog(@"下载结束:%@",filePath);
 95         NSLog(@"失败信息:%@",error);  //失败信息如果是空 说明下载成功 否则失败
 96         
 97     }];
 98     
 99     //手动开始下载
100     [downloadTask resume];
101     
102 }
103 
104 //观察者执行的方法
105 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context {
106     
107     NSLog(@"%@",change);
108     
109     //取出进度最新的值
110     CGFloat value = [[change objectForKey:@"new"] floatValue];
111     
112     //谨记:线程不能直接对UI进行操作否则会出现假死状态
113 //    _progressView.progress = value;  //这样写是错误
114     
115     //必须在主线程或主队列中进行UI操作
116     //添加到主队列中 参数1是Block形式
117     [[NSOperationQueue mainQueue] addOperationWithBlock:^{
118         
119         //在此Block里面进行UI操作
120         
121         _progressView.progress = value;
122     }];
123     
124 }
125 
126 
127 //4.监测网络状态
128 - (void)testNetState {
129  
130     //网络监测管理者 注意:是单例对象
131     AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
132     
133     //设置网络监测状态改变
134     [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
135         /*
136          AFNetworkReachabilityStatusUnknown          = -1, 未知网络
137          AFNetworkReachabilityStatusNotReachable     = 0,  无网络
138          AFNetworkReachabilityStatusReachableViaWWAN = 1,  运营商网络 如2G 3G 4G 5G
139          AFNetworkReachabilityStatusReachableViaWiFi = 2, wifi网络
140          */
141         switch (status) {
142             case AFNetworkReachabilityStatusUnknown:
143             {
144                 NSLog(@"未知网络");
145             }
146                 break;
147             case AFNetworkReachabilityStatusNotReachable:
148             {
149                 NSLog(@"无网络");
150             }
151                 break;
152             case AFNetworkReachabilityStatusReachableViaWiFi:
153             {
154                 NSLog(@"wifi网络");
155             }
156                 break;
157             case AFNetworkReachabilityStatusReachableViaWWAN:
158             {
159                 NSLog(@"运营商网络");
160             }
161                 break;
162             
163             default:
164                 break;
165         }
166     }];
167     //管理者开始监测网络
168     [manager startMonitoring];
169 }
170 
171 
172 //3.用post方式上传图片
173 - (void)testUploadImageWithPost:(NSString *)m_auth {
174     
175     //拿到上传头像的接口
176     NSString *path = @"http://10.0.8.8/sns/my/upload_headimage.php";
177     
178     AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
179     //设置content-type
180     manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
181     //参数列表 (字典类型)
182     NSDictionary *paramters = @{@"m_auth":m_auth};
183     //用post上传图片
184     /*
185      第一个参数:接口网址路径
186      第二个参数:参数列表 (字典类型)
187      第三个参数:上传图片的block(请求体)
188      第四个参数:进度block
189      第五个参数:成功block
190      第六个参数:失败block
191      */
192     [manager POST:path parameters:paramters constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
193         
194         //这个Block是上传图片的block或者说上传正文block
195         //取出文件的路径(在工程中相对)如果打印是绝对路径
196 //        NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"upload" ofType:@"png"];
197         
198         NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"upload2" ofType:@"jpg"];
199 
200         /*
201          第一个参数:原始图片位置的URL
202          第二个参数:名字:这个名字由后台提供
203          第三个参数:上传后文件的名字,这个名字不重要(自定义)
204          第四个参数:MIME类型 这里是PNG格式图片类型 image/png
205          第五个参数:报错信息
206          */
207         
208         /*
209          超文本标记语言文本 .html text/html
210          xml文档 .xml text/xml
211          XHTML文档 .xhtml application/xhtml+xml
212          普通文本 .txt text/plain
213          RTF文本 .rtf application/rtf
214          PDF文档 .pdf application/pdf
215          Microsoft Word文件 .word application/msword
216          PNG图像 .png image/png
217          GIF图形 .gif image/gif
218          JPEG图形 .jpeg,.jpg image/jpeg
219          au声音文件 .au audio/basic
220          MIDI音乐文件 mid,.midi audio/midi,audio/x-midi
221          RealAudio音乐文件 .ra, .ram audio/x-pn-realaudio
222          MPEG文件 .mpg,.mpeg video/mpeg
223          AVI文件 .avi video/x-msvideo
224          GZIP文件 .gz application/x-gzip
225          TAR文件 .tar application/x-tar
226          任意的二进制数据 application/octet-stream
227          */
228         [formData appendPartWithFileURL:[NSURL fileURLWithPath:imagePath] name:@"headimage" fileName:@"upload2.jpg" mimeType:@"image/jpeg" error:nil];
229         
230     } progress:^(NSProgress * _Nonnull uploadProgress) {
231         
232         NSLog(@"进度:%@",uploadProgress);
233         
234     } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
235         NSLog(@"上传成功");
236         
237     } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
238         NSLog(@"上传失败%@",error);
239         
240     }];
241     
242 }
243 
244 
245 //2.使用post请求数据
246 - (void)testPost {
247     //接口网站
248     NSString *path = @"http://10.0.8.8/sns/my/login.php";
249     //创建网络请求管理者对象
250     AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
251     //网络传输类型
252     manager.responseSerializer = [AFHTTPResponseSerializer serializer];
253     //post请求
254     //请求参数和get请求类同 但是第二个参数:参数列表根据接口文档而定
255     [manager POST:path parameters:@{@"username":@"1602qingdao1",@"password":@"woaini"} progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
256         NSLog(@"请求登录接口成功");
257         NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];
258         NSLog(@"%@",dic);
259         
260         NSLog(@"message:%@",[dic objectForKey:@"message"]);
261         
262         NSString *m_auth = [dic objectForKey:@"m_auth"];
263         //登录成功后直接上传头像
264         [self testUploadImageWithPost:m_auth];
265         
266         
267         
268     } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
269         
270         NSLog(@"请求登录接口失败:%@",error);
271         
272     }];
273     
274     
275 }
276 
277 //1.使用Get方法请求数据
278 - (void)testGet {
279     
280     //1.拿到网站
281     NSString *path = @"http://www.weather.com.cn/data/cityinfo/101010100.html";
282     
283     //2.创建字一个网络请求管理者对象 (http会话管理者)  此对象不是单例对象
284     AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
285     //3.设置网络传输的类型:这里一般都是二进制
286     manager.responseSerializer = [AFHTTPResponseSerializer serializer];
287     //4.设置content-type请求头 (可选)这里表示可以接受的数据类型(text/html)MIME
288     manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
289     
290     //5.get请求
291     /*
292      AF的get请求方式
293      第一个参数:path网址路径 字符串类型
294      第二个参数:参数列表,这里放入nil 一般get方法都是nil
295      第三个参数:进度代码块 进度一般在调试的时候用到,通常状况也是nil
296      第四个参数:成功代码块 请求数据成功后会调用到成功代码块
297      第五个参数:失败代码块 请求数据失败后回调用到失败代码块
298      
299      */
300     
301     [manager GET:path parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
302         
303         NSLog(@"成功");
304         
305         NSLog(@"---%@",responseObject);
306         
307         //解析
308         NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];
309         NSLog(@"%@",dic);
310         
311         
312         
313     } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
314         
315         NSLog(@"失败:%@",error);
316         
317         
318     }];
319      
320 }
321 
322 @end

 

posted @ 2016-04-26 18:32  甘林梦  阅读(1621)  评论(0编辑  收藏  举报