开源中国iOS客户端学习——(八)网络通信AFNetworking类库
AFNetworking是一个轻量级的iOS网络通信类库,继ASI类库不在更新之后开发者们有一套不错选择;
AFNetworking类库×××和使用教程: https://github.com/AFNetworking/AFNetworking
如果想深入研究有官方文档介绍:http://afnetworking.github.com/AFNetworking/
在开源中国iOS客户端中关于AFNetworking类库的使用只用到了两个实例方法
(1)getPath:parameters:success:failure:
(2)postPath:parameters:success:failure:
他们用法基本相同,只是请求数据方式不同,一种是Get请求和Post请求。Get是向服务器发索取数据的一种请求,也就相当于查询信息功能,不会修改类容,Post是向服务器提交数据的一种请求,影响数据内容;两种方法定义:
- (void)getPath:(NSString *)path parameters:(NSDictionary *)parameters success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure { NSURLRequest *request = [self requestWithMethod:@"GET" path:path parameters:parameters]; AFHTTPRequestOperation *operation = [self HTTPRequestOperationWithRequest:request success:success failure:failure]; [self enqueueHTTPRequestOperation:operation]; }
- (void)postPath:(NSString *)path parameters:(NSDictionary *)parameters success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure { NSURLRequest *request = [self requestWithMethod:@"POST" path:path parameters:parameters]; AFHTTPRequestOperation *operation = [self HTTPRequestOperationWithRequest:request success:success failure:failure]; [self enqueueHTTPRequestOperation:operation]; }
getPath:parameters:success:failure:方法在程序中使用举例:
NewsView.m
- (void)reload:(BOOL)noRefresh { //如果有网络连接 if ([Config Instance].isNetworkRunning) { if (isLoading || isLoadOver) { return; } if (!noRefresh) { allCount = 0; } int pageIndex = allCount/20; NSString *url; switch (self.catalog) { case 1: url = [NSString stringWithFormat:@"%@?catalog=%d&pageIndex=%d&pageSize=%d", api_news_list, 1, pageIndex, 20]; break; case 2: url = [NSString stringWithFormat:@"%@?type=latest&pageIndex=%d&pageSize=%d", api_blog_list, pageIndex, 20]; break; case 3: url = [NSString stringWithFormat:@"%@?type=recommend&pageIndex=%d&pageSize=%d", api_blog_list, pageIndex, 20]; break; } [[AFOSCClient sharedClient]getPath:url parameters:Nil success:^(AFHTTPRequestOperation *operation, id responseObject) { [Tool getOSCNotice2:operation.responseString]; isLoading = NO; if (!noRefresh) { [self clear]; } @try { NSMutableArray *newNews = self.catalog <= 1 ? [Tool readStrNewsArray:operation.responseString andOld: news]: [Tool readStrUserBlogsArray:operation.responseString andOld: news]; int count = [Tool isListOver2:operation.responseString]; allCount += count; if (count < 20) { isLoadOver = YES; } [news addObjectsFromArray:newNews]; [self.tableNews reloadData]; [self doneLoadingTableViewData]; //如果是第一页 则缓存下来 if (news.count <= 20) { [Tool saveCache:5 andID:self.catalog andString:operation.responseString]; } } @catch (NSException *exception) { [NdUncaughtExceptionHandler TakeException:exception]; } @finally { [self doneLoadingTableViewData]; } } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"新闻列表获取出错"); //如果是刷新 [self doneLoadingTableViewData]; if ([Config Instance].isNetworkRunning == NO) { return; } isLoading = NO; if ([Config Instance].isNetworkRunning) { [Tool ToastNotification:@"错误 网络无连接" andView:self.view andLoading:NO andIsBottom:NO]; } }]; isLoading = YES; [self.tableNews reloadData]; } //如果没有网络连接 else { NSString *value = [Tool getCache:5 andID:self.catalog]; if (value) { NSMutableArray *newNews = [Tool readStrNewsArray:value andOld:news]; [self.tableNews reloadData]; isLoadOver = YES; [news addObjectsFromArray:newNews]; [self.tableNews reloadData]; [self doneLoadingTableViewData]; } } }
分析一下这里面的代码:
首先是做一个网络连接判断,在开源中国iOS客户端学习——(六)网络连接检测一文中介绍了,作者并不是用这种方法来判断,而是使用getPath:parameters:success:failure:来判断网络的连接,方法使用AFHTTPRequestOperation和“PATCH”请求HTTP客户端操作队列,使用到了block块(iOS 4.0+特性),URL请求成功执行success块里操作,这里面block块没有返回值,接受两个参数,创建请求操作和响应数据请求,URL请求失败执行failure里面的方法,这个block块里仍没有返回值,接受两个参数创建请求操作和NSError对象,描述网络或解析错误状况;
在 if()中的方法[Config Instance].isNetworkRunning==YES的,如果程序加载或者已经加载完毕什么也不返回,如果程序没有加载数据,将数据列表数量显示为0,接下来是在switch()中,根据使用者选择设置不同API接口(下图),然后就是解析显示数据信息,显示在视图中;
在AFNetwork 文件夹中,作者自己添加了一个AFOSCClient类,该类继承AFHTTPClient,又设计了一个sharedClient的类方法,从返回的结果可以推测出它是通过API请求返回json类型的数据,具体什么作用还没看出来;
[Tool getOSCNotice2:operation.responseString];是封装在在Tool类中的解析获取的XML的文件
URL请求成功,还做了一个程序异常处理,防止请求数据过成功程序异常崩溃
关于@try @catch @finally异常处理的使用:
@try
{
//执行的代码,其中可能有异常。一旦发现异常,则立即跳到catch执行。否则不会执行catch里面的内容
}
@catch
{
//除非try里面执行代码发生了异常,否则这里的代码不会执行
}
@finally
{
//不管什么情况都会执行,包括try catch 里面用了return ,可以理解为只要执行了try或者catch,就一定会执行 finally
}
如果URL请求的数据出错,则反应网络不连通,数据不能加载,则弹出GCDiscreetNotificationView提示视图 提示网络错误;
postPath:parameters:success:failure:方法在程序中使用举例:
FriendsView.m
-(void)reload:(BOOL)noRefresh { if (isLoadOver) { [self doneLoadingTableViewData]; return; } [[AFOSCClient sharedClient] postPath:api_friends_list parameters:[NSDictionary dictionaryWithObjectsAndKeys:segement.selectedSegmentIndex == 0 ? @"1" : @"0",@"relation", [NSString stringWithFormat:@"%d", friends.count/20],@"pageIndex", @"20",@"pageSize", [NSString stringWithFormat:@"%d", [Config Instance].getUID],@"uid",nil] success:^(AFHTTPRequestOperation *operation, id responseObject) { if (!noRefresh) { [self clear]; } [self doneLoadingTableViewData]; isLoading = NO; NSString *response = operation.responseString; [Tool getOSCNotice2:response]; @try { TBXML *xml = [[TBXML alloc] initWithXMLString:response error:nil]; TBXMLElement *root = xml.rootXMLElement; //显示 TBXMLElement *_friends = [TBXML childElementNamed:@"friends" parentElement:root]; if (!_friends) { isLoadOver = YES; [self.tableFriends reloadData]; return; } TBXMLElement *first = [TBXML childElementNamed:@"friend" parentElement:_friends]; if (first == nil) { [self.tableFriends reloadData]; isLoadOver = YES; return; } NSMutableArray *newFriends = [[NSMutableArray alloc] initWithCapacity:20]; TBXMLElement *name = [TBXML childElementNamed:@"name" parentElement:first]; TBXMLElement *userid = [TBXML childElementNamed:@"userid" parentElement:first]; TBXMLElement *portrait = [TBXML childElementNamed:@"portrait" parentElement:first]; TBXMLElement *expertise = [TBXML childElementNamed:@"expertise" parentElement:first]; TBXMLElement *gender = [TBXML childElementNamed:@"gender" parentElement:first]; Friend *f = [[Friend alloc] initWithParameters:[TBXML textForElement:name] andUID:[[TBXML textForElement:userid] intValue] andPortrait:[TBXML textForElement:portrait] andExpertise:[TBXML textForElement:expertise] andMale:[[TBXML textForElement:gender] intValue] == 1]; if (![Tool isRepeatFriend: friends andFriend:f]) { [newFriends addObject:f]; } while (first) { first = [TBXML nextSiblingNamed:@"friend" searchFromElement:first]; if (first) { name = [TBXML childElementNamed:@"name" parentElement:first]; userid = [TBXML childElementNamed:@"userid" parentElement:first]; portrait = [TBXML childElementNamed:@"portrait" parentElement:first]; expertise = [TBXML childElementNamed:@"expertise" parentElement:first]; gender = [TBXML childElementNamed:@"gender" parentElement:first]; f = [[Friend alloc] initWithParameters:[TBXML textForElement:name] andUID:[[TBXML textForElement:userid] intValue] andPortrait:[TBXML textForElement:portrait] andExpertise:[TBXML textForElement:expertise] andMale:[[TBXML textForElement:gender] intValue] == 1]; if (![Tool isRepeatFriend:friends andFriend:f]) { [newFriends addObject:f]; } } else break; } if (newFriends.count < 20) { isLoadOver = YES; } [friends addObjectsFromArray:newFriends]; [self.tableFriends reloadData]; } @catch (NSException *exception) { [NdUncaughtExceptionHandler TakeException:exception]; } @finally { [self doneLoadingTableViewData]; } } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"好友列表获取出错"); [self doneLoadingTableViewData]; isLoading = NO; if ([Config Instance].isNetworkRunning) { [Tool ToastNotification:@"错误 网络无连接" andView:self.view andLoading:NO andIsBottom:NO]; } }]; isLoading = YES; [self.tableFriends reloadData]; }
这个方法和getPath:parameters:success:failure:不同的在于请求方式是POST请求,可以向服务器里提交数据;
转载于:https://blog.51cto.com/duxinfeng/1208682
开源中国iOS客户端学习——(八)网络通信AFNetworking类库相关推荐
- 开源中国iOS客户端学习——(五)网络通信ASI类库(1)
如今的应用大部分基予网络,在开源中国iOS客户端源码中关于网络通信方面用了三个类库,ASI和AFNetworking,还有一个苹果官方给出的Reachability用于检测当前网络状况,本文介绍当前用 ...
- 开源中国iOS客户端学习
开源中国iOS客户端学习 续写前言 <开源中国iOS客户端学习>续写前系列博客 http://blog.csdn.net/column/details/xfzl-kykhd.html ...
- 开源中国iOS客户端学习——(十二)用户登陆
---------------------------------------------------------------------------------------------------- ...
- 开源中国iOS客户端学习——(一)Prefix.pch文件
2019独角兽企业重金招聘Python工程师标准>>> 当我们新建一个工程的时候,在Supporting FIles文件下会看到一个以 -Prefix.pch结尾文件的文件,pch ...
- 开源中国iOS客户端学习——(七)MBProgressHUD特效
在开源中国iOS客户端中也用到了MBProgressHUD这个特效,主要作用为应用显示一个过渡的作用,常用于打开一个联网页面加载过程,防止出现假死现象,如果网速慢则告诉用户已经在很努力很努力的加载中. ...
- 开源中国iOS客户端学习——序
------------------------------------------------------------------------------------ 2015.8.19 更新 考虑 ...
- 开源中国IOS客户端
自己想看看别人开发的项目,吸收下经验,然后找到开源中国,有些网上的大牛自己也开发出了开源中国的客户端 在网上看到很多网友说,下载下来安装不了之类的东西,在我这里我带个路,希望对那些朋友有些帮助. ht ...
- 开源中国android客户端学习 第一天
源码地址:http://git.oschina.net/oschina/android-app 第一天,看了很久oschina的源码,然后提取了他的头部和底部(本人新手,见谅哈) 效果图
- 开源中国Android客户端v2.6.5代码开源啦!
我们发布了开源中国Android客户端v2.6.5,这个版本中包含了大量的细节改进,感兴趣的朋友们现在就可以checkout代码出来钻研了交流了. (新版界面实现等,请参考 net.oschina.a ...
最新文章
- MIT警示“深度学习过度依赖算力”,研究三年算法不如用10倍GPU
- asp.net 中显示各类文件
- ASP.net 2.0 Migrating系列 - Master Pages 感触
- Linux grep命令——文本搜索工具
- JVM内存管理机制线上问题排查
- python最佳实践笔记
- java se是不是java_Java SE和java EE究竟有什么实质上的区别
- linux中高端内存和低端内存的概念【转】
- DNS 教父怒喷 DNS-over-HTTPS!
- android逆向工程dex2jar使用
- python爬虫小说爬取
- 安装CDH出现file /opt/cloudera/parcels/.flood/CDH-6.2.0-1.cdh6.2.0.p0.967373-el7.parcel...does not exist
- 计算机安装操作步骤,重新安装计算机系统的步骤,最简单,最安全的操作!
- 信息技术服务风险评估
- VSCode、notepa++列选择(垂直选中)快捷键方法
- 关于服务器ssl配置以后,https无法访问的问题
- 微项目:名片管理系统
- 数据科学 6 参数估计与统计推断(概念)
- Xorg Handler简介
- 【Devc++】迷宫小游戏2.0
热门文章
- java for foreach 效率_Java中LinkedList的fori和foreach效率比较
- html分页实现w3c,分页_w3cschool
- 二级c语言题型分数,计算机二级C语言题型和评分标准
- java 规格overview_《Java數據結構和算法》- OverView
- 360 php offer,审批终于通过了,从面试到拿到奇虎360的offer已经失…
- 正则只能出现特定字符_python正则表达式的简单使用总结
- jdbc dao 工具类mysql_Java基于JDBC实现事务,银行转账及货物进出库功能示例
- java读c二进制文件_如何使用JAVA读取C / Matlab创建的二进制文件
- c语言指针和数组的联系
- 计算机二级循环队列知识点,考点!计算机二级考试公共基础知识冲刺复习笔记:栈、队列和循环队列...