大致流程:
1.抓包:用抓包工具抓到自己想要的数据对应的网址
2.获取数据:在Xcode中引入第三方框架&正确网址获取需要的数据
e.g. HeroNetworking中(NSObject)
+(void)getHeroMessageList:(void(^)(NSError * error)) block;
3.处理数据:将获得的数据通过代码加以利用,取得可用信息。
e.g. HeroList中(NSObject)
+ (void)saveWithResponseObject:(NSDictionary*)responseDictionary;
4.调用数据:引包。然后实例化对象,再调用。(如果是+方法,无需实例化对象,可直接调用)
重点代码&截图:
1. 获取数据:在Xcode中引入第三方框架&正确网址获取需要的数据
2.打印responseObject的部分结果
3. 处理数据:将获得的数据通过代码加以利用,取得可用信息
代码如下:
<span style="font-size:24px;">#pragma -mark 获取英雄列表
+ (void)getHeroMessageList:(void(^)(NSError * error)) block
{
AFHTTPRequestOperationManager * manager = [AFHTTPRequestOperationManager manager];
//manager的可接受的类型为:text/html
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html", nil];
//执行完这句话后,responseObject为该网址通过Jason解析后的数据
[manager GET:_K_APIHEROES_URL_STRING parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
//调用数据接口,参数传responseobject
[HeroList saveWithResponseObject:responseObject];
block(nil);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
block(error);
}];
}</span>
<span style="font-size:24px;">#pragma -mark 将网络请求的数据进行处理
+ (void)saveWithResponseObject:(NSDictionary *)responseDictionary
{
//返回的responsedict的数据,将数据根据字段赋予array
NSArray * allHeroList = [responseDictionary objectForKey:@"all"];
NSArray * freeHeroList = [responseDictionary objectForKey:@"free"];
//全部英雄
for (NSDictionary * dic in allHeroList) {
HeroListObject * obj = [HeroListObject new];
obj.cnName = [dic objectForKey:@"cnName"];
obj.enName = [dic objectForKey:@"enName"];
obj.tag = [dic objectForKey:@"tags"];
obj.title = [dic objectForKey:@"title"];
obj.free = @"NO";
//判断这个英雄是否已经存储过,如果没有,则存储;如果有,则更新;如果超过一个,说明有重复,则保留第一个,删除其他的,更新剩下的。
NSArray * heroArr = [self queryHero:obj free:NO];
//判断数组是否为空
//#define kArrayEmpty(arr) (arr == nil || arr.count == 0)
if (kArrayEmpty(heroArr)) {
[self save:obj];
}else if(heroArr.count == 1){
HeroList * herolist = [heroArr objectAtIndex:0];
herolist.free = obj.free;
[[AppDelegate sharedApplication] saveContext];
}else{
for (int i = 0; i < heroArr.count ; i ++) {
if (i == 0) {
[[AppDelegate sharedApplication].managedObjectContext refreshObject:heroArr[i] mergeChanges:NO];
[[AppDelegate sharedApplication] saveContext];
}else{
[[AppDelegate sharedApplication].managedObjectContext deleteObject:heroArr[i]];
[[AppDelegate sharedApplication] saveContext];
}
}
}
}
//免费英雄
for (NSDictionary * dic in freeHeroList) {
HeroListObject * obj = [HeroListObject new];
obj.cnName = [dic objectForKey:@"cnName"];
obj.enName = [dic objectForKey:@"enName"];
obj.title = [dic objectForKey:@"title"];
obj.free = @"YES";
NSArray * heroArr = [self queryHero:obj free:YES];
if (!kArrayEmpty(heroArr)) {
HeroList * herolist = [heroArr objectAtIndex:0];
herolist.free = obj.free;
[[AppDelegate sharedApplication] saveContext];
}
}
}</span>
不过自己写代码的时候一般都是先写保存数据方法,再写网络获取块语法,最后调用。