网络

NSURLConnection

NSURLSession

普通网络请求

JSON数据解析

JSON序列化

数据解析

解析规则:

具体示例

重写setValue: forUndefinedKey:方法

重写setNilValueForKey:方法

解析的几种方式

KVC

网络类的基本封装(非终极版)

SDWebImage

MJRefresh

NSURLConnection

这种网络请求方式, 在iOS9已经被彻底抛弃了. 官方推荐使用功能更加强大完善的NSURLSession.

NSURLSession

iOS7之后生效的原生网络请求类, 取代之前的NSURLSession

普通网络请求

NSURLSession*session = [NSURLSessionsharedSession];

NSURLSessionDataTask*task = [session dataTaskWithURL:[NSURLURLWithString:kHeroPath] completionHandler:^(NSData* _Nullable data,NSURLResponse* _Nullable response,NSError* _Nullable error) {

/*data参数就是从网络上下载下来的数据

这个数据是服务器把 字典/数组 根据JSON协议编码以后生成的. 拿到JSON数据以后, 我们要反编码 回到字典或者数组

*/

//因为根据返回值类型, 可以看到是字典类型的

//Serialization:序列化

//参数2:options 代表当前data原始数据是什么类型

//MutableContainers:代表原始数据是数组/字典

NSError*err =nil;

NSDictionary*responseObj = [NSJSONSerializationJSONObjectWithData:data options:NSJSONReadingMutableContainerserror:&err];

NSLog(@"responseObj %@", responseObj);

self.parse= [HerosParse parse:responseObj];

NSLog(@"");

//数据获取完成以后, 要刷新界面. 网络请求是子线程, 刷新界面要回归主线程

[[NSOperationQueuemainQueue] addOperationWithBlock:^{

[_tableView reloadData];//刷新界面

}];

}];

//开始发送请求

[task resume];

JSON数据解析

JSON序列化

数据从服务器传递到终端, 数据通常是字典或者数组类型, 当传递这些类型时,

需要通过一定的规则把数组/字典转化为字符串的形式, 这个规则称为Json.

当终端获取到这些字符串时, 需要再重新转换为数据原本的样式.

我们称这种 字典/数组 和 JSON样式字符串 之间的转化, 为JSON序列化

//把JSON的数据 转换为 原始状态

NSError*err =nil;

NSDictionary*responseObj = [NSJSONSerializationJSONObjectWithData:data options:NSJSONReadingMutableContainerserror:&err];

//参数2 代表原始状态的数据类型

typedefNS_OPTIONS(NSUInteger,NSJSONReadingOptions) {

NSJSONReadingMutableContainers= (1UL <<0),//可变数组/字典

NSJSONReadingMutableLeaves= (1UL <<1),//可变字符串

NSJSONReadingAllowFragments= (1UL <<2)//允许JSON字符串最外层既不是NSArray也不是NSDictionary,但必须是有效的JSON Fragment

}NS_ENUM_AVAILABLE(10_7,5_0);

//把OC类型 转为 JSON数据

[NSJSONSerializationdataWithJSONObject:responseObj options:NSJSONWritingPrettyPrintederror:nil];

数据解析

在使用字典时, 要经常使用字符串的key来获取字典中的value, 这样用起来很麻烦.

因为字符串没有代码提示, 容易犯错. 这时候就自然有了一个需求, 要把字典转化为对象来使用.

我们称这种把字典转化为类的方式为数据解析.

解析规则:

遇到字典则新建类型

建完类型以后 立刻把所有的键对应的属性声明

每个类型都需要一个解析 类方法

对于数组类型的属性, 要标记它的内容, 通过@class引入类型

解析方法的实现顺序, 由底层向表层实现

具体示例

//对于下方字典的解析操作

{

"all": [

{

"cnName":"俄洛伊",

"enName":"Illaoi",

"location":"上单",

"price":"6300,4500",

"rating":"8,6,3,4",

"tags":"fighter",

"title":"海兽祭司"

}]

}

//解析类

@classHerosAllParse;

@interfaceHerosParse:NSObject

@property(nonatomic)NSArray *all;

+ (instancetype)parse:(NSDictionary*)dic;

@end

@interfaceHerosAllParse:NSObject

@property(nonatomic)NSString*cnName;

@property(nonatomic)NSString*enName;

@property(nonatomic)NSString*location;

@property(nonatomic)NSString*price;

@property(nonatomic)NSString*rating;

@property(nonatomic)NSString*tags;

@property(nonatomic)NSString*title;

+ (instancetype)parse:(NSDictionary*)dic;

@end

@implementationHerosParse

+ (instancetype)parse:(NSDictionary*)dic{

NSMutableArray*arr = [NSMutableArraynew];

NSArray*array = dic[@"all"];

for(NSDictionary*dicinarray) {

[arr addObject:[HerosAllParse parse:dic]];

}

//把内容是字典的数组 替换为 内容是**类型的数组

NSMutableDictionary*mutableDic = [NSMutableDictionarydictionaryWithDictionary:dic];

[mutableDic setObject:arr forKey:@"all"];

idobj = [selfnew];

[obj setValuesForKeysWithDictionary:mutableDic];

returnobj;

}

- (void)setValue:(id)value forUndefinedKey:(NSString*)key{}

- (void)setNilValueForKey:(NSString*)key{}

@end

@implementationHerosAllParse

+ (instancetype)parse:(NSDictionary*)dic{

idobj = [selfnew];

[obj setValuesForKeysWithDictionary:dic];

returnobj;

}

- (void)setValue:(id)value forUndefinedKey:(NSString*)key{}

- (void)setNilValueForKey:(NSString*)key{}

@end

重写setValue: forUndefinedKey:方法

通过重写此方法, 可以防止对不存在的key使用KVC方式复制, 而导致的崩溃现象

重写setNilValueForKey:方法

通过重写此方法, 可以防止对key赋nil值, 导致的崩溃现象

解析的几种方式

//通过KVC方式赋值, 可以有效减少代码量

+ (HeroParse *)parse:(NSDictionary *)dic{

HeroParse *parse = [self new];

//自动把字典的键值对应放到属性中

[parsesetValuesForKeysWithDictionary:dic];

//遍历字典enumerate: 遍历,枚举

/*

[dic enumerateKeysAndObjectsUsingBlock:^(id_Nonnull key, id_Nonnull obj, BOOL * _Nonnull stop) {

[parsesetValue:objforKey:key];

}];

*/

//通过KVC的方式对属性进行赋值

//[parsesetValue:dic[@"cnName"]forKey:@"cnName"];

//parse.cnName = dic[@"cnName"];

/*

parse.enName = dic[@"enName"];

parse.location = dic[@"location"];

parse.price = dic[@"price"];

parse.rating = dic[@"rating"];

parse.tags = dic[@"tags"];

parse.title = dic[@"title"];

*/

returnparse;

}

KVC

除了一般的赋值和取值的方法,我们还可以用Key-Value-Coding(KVC)键值编码来访问你要存取的类的属性。

例如:

@interfaceStudent:NSObject

@propertyNSString*name;

@end

Student *stu = [Student new];

//这是使用getter和setter方法来对值进行读取和写入操作

stu.name=@"小明";

NSLog(@"%@", stu.name);

//KVC方式

[stu setValue:@"小明"forKey:@"name"];

NSLog(@"%@", [stu valueForKey:@"name"]);

网络类的基本封装(非终极版)

根据程序的设计原则: MVC, 解耦和

ViewController应该只负责把数据呈现在View上

所以要把网络请求的逻辑独立放在外部

@interfaceServerNetwork:NSObject

+ (id)getServerListCompletionHandle:(void(^)(idmodel,NSError*error))completionHandle;

@end

@implementation

+ (id)getServerListCompletionHandle:(void(^)(id,NSError*))completionHandle{

NSString*path =@"http://lolbox.duowan.com/phone/apiServers.php?v=77&OSType=iOS8.2&versionName=2.1.7";

NSURLSessionDataTask*task = [[NSURLSessionsharedSession] dataTaskWithURL:[NSURLURLWithString:path] completionHandler:^(NSData* _Nullable data,NSURLResponse* _Nullable response,NSError* _Nullable error) {

if(error) {//请求操作出现问题

completionHandle(nil, error);

return;

}

NSError*err =nil;

NSArray*arr = [NSJSONSerializationJSONObjectWithData:data options:NSJSONReadingMutableContainerserror:&err];

if(err) {//JSON解析出错了

completionHandle(nil, err);

return;

}

//开始解析

NSMutableArray*mulArr = [NSMutableArraynew];

for(NSDictionary*dicinarr) {

[mulArr addObject:[ServerParse parse:dic]];

}

//为了安全考虑,返回的数组应该是不可变数组

completionHandle([mulArrcopy],nil);

}];

[task resume];

returntask;

}

@end

SDWebImage

github上目前最好的为原生控件增加网络图片功能的第三方类库.SDWebImage

//专门用于为图片控件添加网络操作的Category

#import"UIImageView+WebCache.h"

//SDWebImage

UIImageView*iconIV = [UIImageViewnew];

NSString*path = [NSStringstringWithFormat:@"http://img.lolbox.duowan.com/champions/%@_120x120.jpg", _heroInfo.enName];

//SDWebImage让UIImageView类型拥有了网络功能

[iconIV sd_setImageWithURL:[NSURLURLWithString:path]];

MJRefresh

国人编写的, 为滚动视图添加刷新UI的第三方框架.MJRefresh

官方有详细的中文文档, 自行查看

#import"MJRefresh.h"//上下拉动的UI显示

//为表格添加下拉刷新头部UI控件

_tableView.mj_header= [MJRefreshNormalHeader headerWithRefreshingBlock:^{

[ServerNetwork getServerListCompletionHandle:^(idmodel,NSError*error) {

if(error) {

NSLog(@"error %@", error);

}else{

self.servers= model;

//刷新界面要在主线程中做

[[NSOperationQueuemainQueue] addOperationWithBlock:^{

[_tableView reloadData];

}];

}

[[NSOperationQueuemainQueue] addOperationWithBlock:^{

//结束刷新操作

[_tableView.mj_headerendRefreshing];

}];

}];

}];

//刚运行时,应该刷新一次

[_tableView.mj_headerbeginRefreshing];

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容