JSON与MBP的使用

声明

本文章仅供参考,写此博客主要是为了记录本人的iOS学习历程,如果感兴趣的话可以看下源码:
GitHub地址

介绍

  • 使用了AFNetworking,以及MBProgressHUD第三方库。
  • 懒加载的使用。
  • 学习阶段:4.19 - 5.4。

使用

首先上主要代码,后面再对部分内容进行扩展:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
- (IBAction)get:(id)sender {
NSString *URLString=@"http://vedio.wxz.name/api/vedio.html";
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
((AFJSONResponseSerializer *)manager.responseSerializer).removesKeysWithNullValues = YES;//有什么作用? 将所有的NSNull值变成nil:json解析的时候,会把null解析成NSNull对象,如果向这个NSNull对象发送消息的话会崩。
//设置超时时间
[manager.requestSerializer willChangeValueForKey:@"timeoutInterval"];
manager.requestSerializer.timeoutInterval = 15;//这个值是什么意思? 网络请求超时时间设置为5s
[manager.requestSerializer didChangeValueForKey:@"timeoutInterval"];
MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
hud.label.text = @"加载中...";
//请求
[manager GET:URLString parameters:nil progress:nil
success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject)
{
if ([responseObject[@"msg"] isEqualToString:@"ok"])
{
//_datas=[[NSMutableArray alloc]init]; //不使用懒加载的话可以在这里或者GET之前初始化数据
for(NSDictionary *eachDic in responseObject[@"links"])
{
NSLog(@"%@",eachDic);
Vedio *vedio=[[Vedio alloc]initWithDic:eachDic];
[self.datas addObject:vedio];//换成_datas会怎么样? 懒加载调用 没有初始化不会输出数据
_showButton.hidden=false; //不隐藏
}
hud.label.text = @"加载成功!";
[hud hideAnimated:YES afterDelay:0.2];
}
else
{
hud.label.text = @"加载错误!";
NSLog(@"数据错误");
[hud hideAnimated:YES afterDelay:0.5];
}
}
failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error)
{
hud.label.text = @"网络超时";
NSLog(@"网络超时");
[hud hideAnimated:YES afterDelay:0.5];
}
];
}
- (IBAction)show:(id)sender {
MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
hud.label.text = @"打印中...";
NSLog(@"%@",_datas[1]);
for (Vedio *vedio in _datas) {
NSLog(@"标题:%@,图片:%@",vedio.name,vedio.img);
}
[hud hideAnimated:YES afterDelay:0.3];
}
//为什么要有这个方法? 懒加载
-(NSMutableArray *)datas{
if (!_datas) {
_datas=[[NSMutableArray alloc]init];
}
return _datas;
}

运行界面:

##AFNetworking简介
想要进行iOS开发的我,不知道NSUrlRequest、不知道NSUrlConnection、也不知道NSURLSession…(说不下去了…真的什么都不知道…)但是现在只要是请求网络都会想到使用AFN。关于AFN虽然用的次数少,甚至真正的实现还是得参照着别人的代码来写咳!没毛病!。但是还是加深了对AFN的了解,首先是它的优缺点:

  1. 优点:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    1. 维护和使用者比较多
    2. 对ARC支持
    3. 对Block的支持非常好
    4. 专门对异步请求的支持
    5. 支持基于URL 缓存
    6. 图片以及NSURLCache AFCache缓存使用
    7. 支持后台下载,缓存离线请求的支持(SDURLCache)
    8. 对JSON支持比较好
    9. 对实现的http请求比较容易
    10. 对HTTPS 的支持
  2. 缺点

    1
    2
    * 是基于Foundation框架的NSURLConnection对网络进行的封装,不是用的底层的CFNetwork进行的封装,扩展功能可能稍微少一些。
    * 但是在http上的网络支持已经足够。

基本使用

  • 设置超时

    1
    2
    3
    [manager.requestSerializer willChangeValueForKey:@"timeoutInterval"];
    manager.requestSerializer.timeoutInterval = 15;//这个值是什么意思? 网络请求超时时间设置为5s
    [manager.requestSerializer didChangeValueForKey:@"timeoutInterval"];
  • GET请求网络数据方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    [manager GET:URLString parameters:nil progress:nil
    success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject)
    {
    if ([responseObject[@"msg"] isEqualToString:@"ok"])
    {
    //_datas=[[NSMutableArray alloc]init]; //不使用懒加载的话可以在这里或者GET之前初始化数据
    for(NSDictionary *eachDic in responseObject[@"links"])
    {
    NSLog(@"%@",eachDic);
    Vedio *vedio=[[Vedio alloc]initWithDic:eachDic];
    [self.datas addObject:vedio];//换成_datas会怎么样? 懒加载调用 没有初始化不会输出数据
    _showButton.hidden=false; //不隐藏
    }
    hud.label.text = @"加载成功!";
    [hud hideAnimated:YES afterDelay:0.2];
    }
    else
    {
    hud.label.text = @"加载错误!";
    NSLog(@"数据错误");
    [hud hideAnimated:YES afterDelay:0.5];
    }
    }
    failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error)
    {
    hud.label.text = @"网络超时";
    NSLog(@"网络超时");
    [hud hideAnimated:YES afterDelay:0.5];
    }
    ];

##MBProgressHUD简介
MBProgressHUD是一个显示HUD窗口的第三方类库,用于在执行一些后台任务时,在程序中显示一个表示进度的loading视图和两个可选的文本提示的HUD窗口。

基本使用

模式

1
2
3
4
5
6
7
8
typedef enum {
MBProgressHUDModeIndeterminate, //系统自带的指示器(默认),没有进度,只能不停的转菊花
MBProgressHUDModeDeterminate, //饼图
MBProgressHUDModeDeterminateHorizontalBar, //进度条
MBProgressHUDModeAnnularDeterminate, //圆环
MBProgressHUDModeCustomView, //自定义视图
MBProgressHUDModeText //只显示文字
} MBProgressHUDMode;
  • 系统自带指示器
    1
    hud.mode = MBProgressHUDModeIndeterminate;
  • 饼图

    1
    hud.mode = MBProgressHUDModeDeterminate;
  • 进度条

    1
    hud.mode = MBProgressHUDModeDeterminateHorizontalBar;
  • 圆环

    1
    hud.mode = MBProgressHUDModeAnnularDeterminate;
  • 只显示文字

    1
    2
    hud.mode = MBProgressHUDModeText;
    hud.labelText = @"MBProgressHUDModeText";

初始化及其他基本使用

  • 初始化

    1
    2
    MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
    hud.label.text = @"加载中...";//菊花文本
  • 隐藏

    1
    [hud hideAnimated:YES afterDelay:0.2];//afterDelay的值为停留时间。

懒加载简介

  • 懒加载可以定义为:延时加载,即当对象需要用到的时候再去加载。其实就是重写对象的get方法,当系统或者开发者调用对象的get方法时,再去加载对象。

懒加载的优点

  • 不需将对象的实例化写到viewDidLoad中,可以简化代码,增强代码的可读性。
  • 对系统的内存占用率会减小。
  • 对象的实例化在getter方法中,各司其职,降低耦合性。

懒加载使用对比

1
2
3
4
//如果不使用懒加载
...
_datas=[[NSMutableArray alloc]init];//不使用懒加载的话可以在这里或者GET之前初始化数据
...
1
2
3
4
5
6
7
8
//使用懒加载
-(NSMutableArray *)datas{
//先判断对象当前是否为空,为空的话再去实例化对象。
if (!_datas) {
_datas=[[NSMutableArray alloc]init];
}
return _datas;
}

在本文的代码中我们可以发现,如果不使用懒加载,datas的初始化存在于- (IBAction)get:(id)sender方法中,这是在该对象的初始化后紧接着使用。但是在大多数情况下,一个对象的使用不会局限于此,甚至于在各种地方都需要调用,那么此时如果不使用懒加载的话则会浪费很多内存资源。而懒加载则无需担心这些,我们只需要在使用的时候self.XXX,系统会自动加载好对象。