日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

开源中国iOS客户端学习——(八)网络通信AFNetworking类库

發(fā)布時間:2025/3/8 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 开源中国iOS客户端学习——(八)网络通信AFNetworking类库 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

AFNetworking是一個輕量級的iOS網(wǎng)絡通信類庫,繼ASI類庫不在更新之后開發(fā)者們有一套不錯選擇;

AFNetworking類庫×××和使用教程:?https://github.com/AFNetworking/AFNetworking

如果想深入研究有官方文檔介紹:http://afnetworking.github.com/AFNetworking/


在開源中國iOS客戶端中關于AFNetworking類庫的使用只用到了兩個實例方法

(1)getPath:parameters:success:failure:

(2)postPath:parameters:success:failure:

他們用法基本相同,只是請求數(shù)據(jù)方式不同,一種是Get請求和Post請求Get是向服務器發(fā)索取數(shù)據(jù)的一種請求,也就相當于查詢信息功能,不會修改類容,Post是向服務器提交數(shù)據(jù)的一種請求,影響數(shù)據(jù)內(nèi)容;兩種方法定義:


- (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 { //如果有網(wǎng)絡連接 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:@"錯誤 網(wǎng)絡無連接" andView:self.view andLoading:NO andIsBottom:NO]; } }]; isLoading = YES; [self.tableNews reloadData]; } //如果沒有網(wǎng)絡連接 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]; } } }

分析一下這里面的代碼:

首先是做一個網(wǎng)絡連接判斷,在開源中國iOS客戶端學習——(六)網(wǎng)絡連接檢測一文中介紹了,作者并不是用這種方法來判斷,而是使用getPath:parameters:success:failure:來判斷網(wǎng)絡的連接,方法使用AFHTTPRequestOperation和“PATCH”請求HTTP客戶端操作隊列,使用到了block塊(iOS 4.0+特性),URL請求成功執(zhí)行success塊里操作,這里面block塊沒有返回值,接受兩個參數(shù),創(chuàng)建請求操作和響應數(shù)據(jù)請求,URL請求失敗執(zhí)行failure里面的方法,這個block塊里仍沒有返回值,接受兩個參數(shù)創(chuàng)建請求操作和NSError對象,描述網(wǎng)絡或解析錯誤狀況;


?if()中的方法[Config Instance].isNetworkRunning==YES的,如果程序加載或者已經(jīng)加載完畢什么也不返回,如果程序沒有加載數(shù)據(jù),將數(shù)據(jù)列表數(shù)量顯示為0,接下來是在switch()中,根據(jù)使用者選擇設置不同API接口(下圖),然后就是解析顯示數(shù)據(jù)信息,顯示在視圖中;

??

在AFNetwork 文件夾中,作者自己添加了一個AFOSCClient類,該類繼承AFHTTPClient,又設計了一個sharedClient的類方法,從返回的結(jié)果可以推測出它是通過API請求返回json類型的數(shù)據(jù),具體什么作用還沒看出來;


[Tool getOSCNotice2:operation.responseString];是封裝在在Tool類中的解析獲取的XML的文件


URL請求成功,還做了一個程序異常處理,防止請求數(shù)據(jù)過成功程序異常崩潰

?關于@try @catch @finally異常處理的使用:


@try
{
//執(zhí)行的代碼,其中可能有異常。一旦發(fā)現(xiàn)異常,則立即跳到catch執(zhí)行。否則不會執(zhí)行catch里面的內(nèi)容
}
@catch
{
//除非try里面執(zhí)行代碼發(fā)生了異常,否則這里的代碼不會執(zhí)行
}
@finally
{
//不管什么情況都會執(zhí)行,包括try catch 里面用了return ,可以理解為只要執(zhí)行了try或者catch,就一定會執(zhí)行 finally
}


如果URL請求的數(shù)據(jù)出錯,則反應網(wǎng)絡不連通,數(shù)據(jù)不能加載,則彈出GCDiscreetNotificationView提示視圖 ?提示網(wǎng)絡錯誤;


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:@"錯誤 網(wǎng)絡無連接" andView:self.view andLoading:NO andIsBottom:NO]; } }]; isLoading = YES; [self.tableFriends reloadData]; }
這個方法和getPath:parameters:success:failure:不同的在于請求方式是POST請求,可以向服務器里提交數(shù)據(jù);




轉(zhuǎn)載于:https://blog.51cto.com/duxinfeng/1208682

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的开源中国iOS客户端学习——(八)网络通信AFNetworking类库的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。