iOS开发网络篇 一一 复杂的JSON解析-数据显示
程序员文章站
2024-01-27 15:43:46
...
下面tableView中的数据,都是从网络中(服务器)下载而来. 正常情况点击每一个cell 会播放视频. 这里视频的url地址有错误. 因此播放错误,正常情况可以播放!
在线格式化http://tool.oschina.net/codeformat/json
效果图如下:
这个项目用到了两个 第三方框架: SDWebImage 、 MJExtension 两个框架:
SDWebImage: 当从网络中下载图片到本地的时候 使用这个框架. 很好的解决了内存缓存,磁盘缓存,重复下载等问题.
MJExtension: 用于数据转换, 字典 转 模型, 模型 转 数组. 等 许多好用的功能
//1.把字典数组转换为模型数组
//使用MJExtension框架进行字典转模型
self.videos = [XMGVideo objectArrayWithKeyValuesArray:videoArray];
//2.重命名模型属性的名称
//第一种重命名属性名称的方法,有一定的代码侵入性
//设置字典中的id被模型中的ID替换
+(NSDictionary *)replacedKeyFromPropertyName
{
return @{
@"ID":@"id"
};
}
//第二种重命名属性名称的方法,代码侵入性为零
[XMGVideo setupReplacedKeyFromPropertyName:^NSDictionary *{
return @{
@"ID":@"id"
};
}];
//3.MJExtension框架内部实现原理-运行时
项目大致步骤:
1. 创建一个UITableViewController. cell的类型 设置 为 Subtitle
2. 解析从服务器返回的响应体数据. (反序列化), 使用一个数组来接收 ( 字典数组 转 模型数组 需要使用 MJExtension框架)
3. 数组中的数据再 赋值给 模型属性 ( 给图片设置数据的时候 使用SDWebImage框架)
4. 当点击cell的时候, 视频的简单播放
代码如下:
ZYVideo模型文件
//
// ZYVideo.h
// 06-掌握-复杂JSON解析-数据展示
//
// Created by 朝阳 on 2017/12/10.
// Copyright © 2017年 sunny. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface ZYVideo : NSObject
/* ID */
@property (nonatomic, strong) NSString *ID;
/* 图片地址 */
@property (nonatomic, strong) NSString *image;
/* 播放时长 */
@property (nonatomic, strong) NSString *length;
/* 标题 */
@property (nonatomic, strong) NSString *name;
/* 视频的url */
@property (nonatomic, strong) NSString *url;
@end
//#import "MJExtension.h"
@implementation ZYVideo
// 使用这种方式 侵入性太大, 使用另一种方式
// ID 替换 id
//+ (NSDictionary *)mj_replacedKeyFromPropertyName
//{
// return @{
//
// @"ID" : @"id"
//
// };
//}
@end
ViewController文件
// ZYTableViewController.m
// 06-掌握-复杂JSON解析-数据展示
//
// Created by 朝阳 on 2017/12/7.
// Copyright © 2017年 sunny. All rights reserved.
//
#import "ViewController.h"
#import "UIImageView+WebCache.h"
#import <MediaPlayer/MediaPlayer.h>
#import "ZYVideo.h"
#import "MJExtension.h"
#define baseUrlStr @"http://120.25.226.186:32812"
@interface ViewController ()
/* 存储模型的 数组 */
@property (nonatomic, strong) NSMutableArray *videos;
@end
@implementation ViewController
- (NSMutableArray *)videos
{
if (!_videos) {
_videos = [NSMutableArray array];
}
return _videos;
}
- (void)viewDidLoad {
[super viewDidLoad];
// 替换 模型中属性的名称 和 系统关键字冲突.(系统自带方法冲突)
[ZYVideo mj_setupReplacedKeyFromPropertyName:^NSDictionary *{
return @{
@"ID" : @"id"
};
}];
//1. 确定url
NSURL *url = [NSURL URLWithString:@"http://localhost:8080/MJServer/video?method=get&type=JSON"];
//2. 创建请求
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//3. 创建异步连接
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
// 容错处理
if (connectionError) {
return ;
}
// 4. 解析数据(反序列化)
NSDictionary *dictM = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
// 使用第三方框架实现: 字典数组 转 模型数组
self.videos = [ZYVideo mj_objectArrayWithKeyValuesArray:dictM[@"videos"]];
//5. 刷新UI
[self.tableView reloadData];
}];
}
#pragma -mark tableView数据源方法
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.videos.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//1. 设置重用标识
static NSString *ID = @"video";
//2. 在缓存池中复用cell(如果没有会自动创建)
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
//3. 设置数据
// NSDictionary *dict = self.videos[indexPath.row];
ZYVideo *video = self.videos[indexPath.row];
cell.textLabel.text = video.name;
cell.detailTextLabel.text = [NSString stringWithFormat:@"播放时间:%@",video.length];
// 使用SDWebImage设置网络中下载的图片
// 拼接图片的url
// NSString *baseUrlStr = @"http://120.25.226.186:32812";
NSString *urlStr = [baseUrlStr stringByAppendingPathComponent:video.image];
[cell.imageView sd_setImageWithURL:[NSURL URLWithString:urlStr] placeholderImage:[UIImage imageNamed:@"qq"]];
NSLog(@"----%@",video.ID);
return cell;
}
#pragma -mark tableView的代理方法
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
//1. 拿到数据
// NSDictionary *dict = self.videos[indexPath.row];
ZYVideo *video = self.videos[indexPath.row];
//2. 拼接资源路径
NSString *urlStr = [baseUrlStr stringByAppendingPathComponent:video.url];
//3. 创建播放器
MPMoviePlayerViewController *mpc = [[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL URLWithString:urlStr]];
//4. 弹出控制器
[self presentViewController:mpc animated:YES completion:nil];
}
@end