數據從JSON文檔中讀取處理的過程稱為“解碼”過程,即解析和讀取過程潜索,來看一下如果利用AFNetworking框架去管理從聚合數據上面請求到的數據臭增。
一、下載并導入AFNetworking框架
這部分內容如果不了解的話可以點擊iOS開發(fā)之網絡編程篇六:AFNetworking3.0使用簡介
二竹习、聚合數據API-餐飲美食
1.申請餐飲美食API:https://www.juhe.cn/docs/api/id/45
聚合數據API用法簡介
2.請求體介紹
lng和lat參數表示對應的經緯度誊抛,用來確定你想要請求哪個地方的美食餐飲,key參數即為APPKEY整陌,你申請該API以后可以到應用詳細頁查詢拗窃,dtype參數是用來確定你想得到的數據是什么格式的瞎领,默認為JSON,如果想要xml格式就需要設置該參數随夸。
3.返回值介紹
該餐飲美食API會返回上圖所示的參數九默,可以根據實際需要來使用。
三宾毒、發(fā)送網絡請求
1.知道API需要請求的參數以后驼修,就可以通過接口地址和API文檔中給出的請求方式,請求到所需的數據诈铛。
2.根據餐飲美食API的接口文檔我們知道需要用get方式去請求乙各。
NSMutableDictionary *params=[NSMutableDictionary dictionary];
//在數組里面添加請求參數
params[@"key"] = @"987d0c7bd487209bd5bb4065b3d4fcc2";
params[@"lng"] = @"121.538123";
params[@"lat"] = @"31.677132";
//創(chuàng)建請求管理者
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//發(fā)送請求,使用get癌瘾,請求成功以后返回的數據會存放到responseObject中
[manager GET:@"http://apis.juhe.cn/catering/query" parameters:params success:^(NSURLSessionDataTask *task, id responseObject) {
//在請求成功以后程序會執(zhí)行success
//此處可以對請求到的數據進行處理
} failure:^(NSURLSessionDataTask *task, NSError *error) {
}];
}
四觅丰、解析返回的數據
1.我們發(fā)送網絡請求以后會返回下圖所示的數據:
從圖中我們可以看到發(fā)送請求以后返回了一個字典,字典中result關鍵字對應的數組就是我們想要得到的數據妨退,我們項目中需要用到該數組中navigation參數對應的數據妇萄,那我就可以遍歷result關鍵字對應的數組,找到navigation參數對應的數據咬荷,然后將其存放到一個新的數組中冠句。
[manager GET:@"http://apis.juhe.cn/catering/query" parameters:params success:^(NSURLSessionDataTask *task, id responseObject) {
//新建一個字典來存放返回的數據
NSMutableDictionary *datasouce=[responseObject mutableCopy];
//在返回的字典中,將關鍵字result索引到的數據存放到另外的數組中
NSArray * resultArray = [datasouce objectForKey:@"result"];
//遍歷resultArray數組得到navigation對應的數據幸乒,并存放到result數組中
for (NSDictionary *dic in resultArray) {
NSString *navigation = [dic objectForKey:@"navigation"];
[result addObject:navigation];
}
[self.delegate data:result];
} failure:^(NSURLSessionDataTask *task, NSError *error) {
NSLog(@"%@",error);
}];
}
2.創(chuàng)建一個繼承于NSObject的Data類懦底,用來得到從聚合數據上面請求到的數據,并在Data.h文件中添加相應的屬性方法
-(void) getdata;//在ViewController中執(zhí)行此方法從而得到JSON數據
3.在Data.m文件中完成相應的屬性方法
-(void) getdata{
__block NSMutableArray *result = [[NSMutableArray alloc] init];
NSMutableDictionary *params=[NSMutableDictionary dictionary];
//在數組里面添加請求參數罕扎,根據聚合數據的文檔說明添加
params[@"key"] = @"987d0c7bd487209bd5bb4065b3d4fcc2";
params[@"lng"] = @"121.538123";
params[@"lat"] = @"31.677132";
//創(chuàng)建請求管理者
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//發(fā)送請求
[manager GET:@"http://apis.juhe.cn/catering/query" parameters:params success:^(NSURLSessionDataTask *task, id responseObject) {
//如果數據請求成功返回到responseObject中
NSMutableDictionary *datasouce=[responseObject mutableCopy];
//在返回的字典中通過關鍵字result索引到的數據存放到另外的數組中
NSArray * resultArray = [datasouce objectForKey:@"result"];
//遍歷resultArray數組得到navigation對應的數據
for (NSDictionary *dic in resultArray) {
NSString *navigation = [dic objectForKey:@"navigation"];
[result addObject:navigation];
}
[self.delegate data:result];
} failure:^(NSURLSessionDataTask *task, NSError *error) {
NSLog(@"%@",error);
}];
}
4.創(chuàng)建一個DataDelegate協議聚唐,并添加相關的代理方法,用來傳遞JSON數據腔召。
#import <Foundation/Foundation.h>
@protocol DataDelegate //通過代理將得到的JSON數據傳遞到ViewController
- (void) data: (NSMutableArray *)array;
@end
@interface Data : NSObject
@property (nonatomic, weak) id <DataDelegate> delegate;//代理屬性
-(void) getdata;
@end
五杆查、在TableView上面顯示得到的JSON數據
1.添加相關的屬性以及代理協議
@interface ViewController ()<UITableViewDataSource,UITableViewDelegate,DataDelegate>
@property (nonatomic, strong) UITableView *myTableView;
@property (nonatomic, strong) NSArray *myArray;//用來存放JSON數據的數組
@property (nonatomic, strong) Data *myData;
@end
2.使懶加載方式初始化所需的控件以及數組
- (Data *)myData{
if (!_myData) {
_myData = [[Data alloc] init];
_myData.delegate = self;
[_myData getdata];
}
return _myData;
}
- (NSArray *) myArray{
if (!_myArray) {
_myArray = [[NSArray alloc ] init];
}
return _myArray;
}
- (UITableView *) myTableView{
if (!_myTableView) {
_myTableView = [[UITableView alloc] initWithFrame:self.view.frame];
_myTableView.dataSource = self;
_myTableView.delegate = self;
[self.view addSubview: _myTableView];
}
return _myTableView;
}
- (void)viewDidLoad {
[super viewDidLoad];
[self myArray];
[self myData];
[self myTableView];
}
3.在tableView的數據源方法中將得到的JSON數據顯示到tableView上面
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return self.myArray.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
if (cell == nil) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
}
if (self.myArray != nil && self.myArray.count > 0) {
cell.textLabel.text = [self.myArray objectAtIndex:[indexPath row]];
}
return cell;
}
4.由于tableView的數據源方法會先執(zhí)行,因此我們需要在Data的代理方法中得到JSON數據以后刷新tableView臀蛛。
- (void)data:(NSMutableArray *)array{
self.myArray = array;
[self.myTableView reloadData];
}