欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

iOS开发网络篇 一一 复杂的JSON解析-数据显示

程序员文章站 2024-01-27 15:43:46
...

下面tableView中的数据,都是从网络中(服务器)下载而来. 正常情况点击每一个cell 会播放视频. 这里视频的url地址有错误. 因此播放错误,正常情况可以播放!

在线格式化http://tool.oschina.net/codeformat/json

效果图如下:

iOS开发网络篇 一一 复杂的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