iOS学习 - 22 异步解析 JSON,使用 Model 存储,TableView 显示

Model 类:

@interface ListModel : NSObject

@property (nonatomic, copy)NSString *time;
@property (nonatomic, copy)NSString *cname;
@property (nonatomic, copy)NSString *summary;
@property (nonatomic, copy)NSString *title;
@property (nonatomic, copy)NSString *type;

- (void)createArray:(NSDictionary *)result
         dataSource:(NSMutableArray *)dataSource;

VC:

#import "ViewController.h"
#import "ListModel.h"
#import "DetailViewController.h"

#define URLSTR @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?date=20131129&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213"

@interface ViewController ()<UITableViewDelegate,UITableViewDataSource>

@property (nonatomic, strong)NSMutableArray *dataSource;
@property (nonatomic, strong)UITableView *tableView;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.title = @"新闻";

    _dataSource = [[NSMutableArray alloc]initWithCapacity:0];
    [self.view addSubview:self.tableView];

    //创建一个异步队列解析 json,防止阻塞主线程
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
    dispatch_async(queue, ^{
        [self urlStr];
    });
}

#pragma mark -- 解析 JSON
- (void)urlStr
{
    NSURL *url = [NSURL URLWithString:URLSTR];
    NSURLSession *session = [NSURLSession sharedSession];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {

        NSError *error1;
        //解析 json,返回字典,这里解析出来是 unicode 编码,不影响正常显示
        NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error1];

        ListModel *listModel = [[ListModel alloc]init];
        [listModel createArray:dict dataSource:_dataSource];

        //数据源开始是空的,因为网络等原因...等数据源有值了,在主线程刷新 TabelView
        dispatch_async(dispatch_get_main_queue(), ^{
            [_tableView reloadData];
        });
    }];
    [task resume];
}

#pragma mark -- UITableViewDataSource
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return _dataSource.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *cell_id = @"cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cell_id];
    if (!cell) {
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cell_id];
    }
    ListModel *listModel = _dataSource[indexPath.row];
    cell.textLabel.text = listModel.title;
    cell.detailTextLabel.text = listModel.time;
    return cell;
}

#pragma mark -- UITableViewDelegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    ListModel *listModel = _dataSource[indexPath.row];
    DetailViewController *detailVC = [[DetailViewController alloc]init];
    [self.navigationController pushViewController:detailVC animated:YES];
    detailVC.titleStr = listModel.cname;
    detailVC.contentStr = listModel.summary;
}

#pragma mark -- getter
- (UITableView *)tableView {
    if (!_tableView) {
        _tableView = [[UITableView alloc]initWithFrame:self.view.frame];
        _tableView.delegate = self;
        _tableView.dataSource = self;
    }
    return _tableView;
}

完整代码,在这里下载

时间: 2024-10-05 06:35:41

iOS学习 - 22 异步解析 JSON,使用 Model 存储,TableView 显示的相关文章

iOS 对于文件的解析 JSON DOM SAX

主要是对文件的三种解析方法,相关的文件已经压缩附件中 .h文件 #import <UIKit/UIKit.h> #import "StudentModel.h" #import "GDataXMLNode.h" @interface RootViewController : UIViewController<NSXMLParserDelegate> @property(nonatomic,retain)NSMutableArray *data

jquery学习笔记---each解析json数据

使用jQuery解析JSON数据 在上一篇的Struts2之ajax初析中,我们得到了comments对象的JSON数据,在本篇中,我们将使用jQuery进行数据解析. 我们先以解析上例中的comments对象的JSON数据为例,然后再小结jQuery中解析JSON数据的方法. 上例中得到的JSON数据如下,是一个嵌套JSON: {"comments":[{"content":"很不错嘛","id":1,"nickn

iOS学习之数据解析

解析:按照约定好的格式提取数据的过程叫做解析; 后台开发人员按照约定好的格式存入数据,前端开发人员按照约定的格式读取数据; 主流的格式: XML / JSON 前端和后台都能识别的格式; XML解析 XML解析的两种工作原理: 1.SAX解析:基于事件回调的解析机制,逐行进行解析,效率低,适合于大数据解析.  系统提供的NSXMLParser. 2.DOM解析:把解析数据读入内存,初始化生成树形结构,逐层进行解析.效率高,适合于小数据解析. 谷歌提供的GDataXMLNode. 解析工具: GD

《项目经验》--后台一般处理程序向前台JS文件传递JSON,JS解析JSON,将数据显示在界面--显示在DropDownList 或 显示在动态创建的table中

http://blog.csdn.net/mazhaojuan/article/details/8599167 先看一下我要实现的功能界面: 这篇文章主要介绍:后台一般处理程序把从数据库查找的数据,转换成JSON,然后传递到前台JS文件中,JS解析JSON数据,并将数据显示在界面,主要介绍两种显示方式,显示在DropDownList控件 or 显示在动态创建的Table表中.   本文主要介绍两个地方: 1.根据学年查询学期信息的实现--JS将解析的JSON数据绑定到DropDownList框

iOS开发-使用NSJSONSerialization解析JSON数据

1.JSON数据结构和解析 1.1JSON数据结构 JSON:JavaScript 对象表示法(JavaScript Object Notation). JSON 是存储和交换文本信息的语法.类似 XML. JSON 比 XML 更小.更快,更易解析. JSON 值可以是: 数字(整数或浮点数) 字符串(在双引号中) 逻辑值(true 或 false) 数组(在方括号中) 对象(在花括号中) null JSON 对象在花括号中书写: 对象可以包含多个名称/值对:名称和值中间使用“:”隔开,类似O

iOS学习之UIStoryboardSegue解析

在 Storyboard 的可视化编程中,跳转界面就是按住 Ctrl 使用鼠标头一条连线就可以解决,相当的简单!本篇博客主要就是介绍这条连线,在iOS中,这条连线也是一个对象,也有其自己的初始化方法和属性.这个对象就是 UIStoryboardSegue . 以前在 可视化编程-Storyboard 中也介绍过 UIStoryboardSegue 的概述和自定义 1.Segue的属性 每一个 Segue 对象,都有3个属性 // 唯一标识 @property (nullable, nonatom

ANDROID_MARS学习笔记_S02_015_Gson解析json串为对象集合

package com.example.s02_e12_json3; import java.lang.reflect.Type; import java.util.Iterator; import java.util.LinkedList; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; impor

iOS学习 - 22 全局跑马灯

思路: 1.创建一个单例 + (instancetype)shareManager { static CCPaomaView *pModel = nil; static dispatch_once_t once; dispatch_once(&once, ^{ pModel = [[CCPaomaView alloc]initWithFrame:CGRectMake(0, 0, KScreenWidth, 0.0468 *KScreenHeight)]; }); return pModel; }

android学习二十三(解析json格式数据)

前面我们已经掌握了xml格式数据的解析方式,那么接下来我们学习下如何解析json格式的数据.比起xml,json的主要优势在于它体积更小,在网络上传输的时候可以更省流量.但缺点在于,它的语义性差,看起来不如xml直观. 开始之前,先在自己的电脑apache-tomcat-6.0.39\webapps\ROOT路径目录下新建一个get_data.json的文件,然后编辑这个文件,并加入如下json格式的内容: [{"id":"5","version"