IOS之网络数据下载和JSON解析

IOS之网络数据下载和JSON解析

简介

  在本文中笔者将要给大家介绍IOS中如何利用NSURLConnection从网络上下载数据,如何解析从网络下载下来的JSON数据格式,以及如何显示实践和图片的异步下载显示

  涉及到的知识点:

  1.NSURLConnection异步下载和封装;

  2.JSON格式和JSON格式解析;

  3.数据显示和使用SDWebImage异步显示图片;

内容

1.网络下载基础知识介绍

  什么是网络应用?

  需要从网络上获取数据的应用

  网络应用的程序结构?

  C/S结构

  Client客户端: 展示数据, 与用户进行交互

  Server服务端: 为客户端提供数据, 提供服务

  常见的网络接口形式?

  地址使用协议+主机地址+主机端口+网页程序文件+程序参数

  常见的数据格式? 

  JSON 跟XML; 

  界面开发的一般流程?

  下载数据,解析数据,建立数据模型,使用视图显示,tabelView+自制Cell;图片的异步下载SDWebImage;

2.NSURLConnection使用

  NSString 的同步下载

  

NSError *error = nil;
    NSURL *url = [NSURL URLWithString:urlString];
    NSString *content = [[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];
    if (error==nil) {
        NSLog(@"content = %@",content);
    }
    else
    {
        NSLog(@"下载失败");
    }

  NSURLConnection 同步下载

  

NSURL *url = [NSURL URLWithString:urlString];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    NSError *error = nil;
    NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:&error];
    if(error == nil)
    {
        NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        NSLog(@"str = %@",str);
    }
    else
    {
        NSLog(@"下载失败");
    }

  NSURLConection异步下载

  

@property (copy,nonatomic) NSMutableData *data;

//作用:
//  传入网址, 下载完成执行后执行target对象中action方法
-(void)requestWithUrl:(NSString *)url target:(id)target action:(SEL)action;


@interface ZJHttpRequest ()<NSURLConnectionDataDelegate>
{
    NSURLConnection *_connection;
    NSString *_url;
    id _target;
    SEL _action;
}
@end

@implementation ZJHttpRequest
//作用:
//  传入网址, 下载完成执行后执行target对象中action方法
-(void)requestWithUrl:(NSString *)url
               target:(id)target
               action:(SEL)action
{
    _url = url;
    _target = target;
    _action = action;
    
    //发起URL请求
    _data = [[NSMutableData alloc] init];
    _connection = [[NSURLConnection alloc] initWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:url]] delegate:self startImmediately:YES];
}
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    [_data appendData:data];
}
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    //下载完成了, 执行保存的方法
    if(_target && [_target respondsToSelector:_action])
    {
        [_target performSelector:_action withObject:self];
    }
    
}

 

3.JSON格式的说明和格式化工具

//JSON

    //JavaScript Object Notation

    /*

    {

        "count":20,

        "data":[

            "zhangsan",

            "lisi",

            "wangwu"

        ]

    }

    */

    //[]    表示数组,对应NSArray

    //,     表示并列的数据

    //{}    表示字典,对应NSDictionary

    //:     表示键值对

    //"ta"  表示字符串,对应NSString

    //20    对应NSNumber

    //JSON格式格式化工具

    //  Jason

    //  Json Editor

    //  在线:  http://www.kjson.com/

4.一个完整页面的实现(包含model的创建,SDWebImage的使用

  创建Model 

  解析JSON的数据

  

NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:request.data options:NSJSONReadingMutableContainers error:nil];
    //NSLog(@"dict = %@",dict);
    NSArray *appList = dict[@"applications"];
    for (NSDictionary *appDict in appList) {
        AppModel *model = [[AppModel alloc] init];
        model.applicationId = appDict[@"applicationId"];
        model.name = appDict[@"name"];
        model.iconUrl = appDict[@"iconUrl"];
        [_dataArray addObject:model];
    }
    
    //下载数据刷新显示
    [_tableView reloadData];

 

  创建UITabelView 跟自制Cell

-(void)createTableView
{
    _tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
    _tableView.dataSource = self;
    _tableView.delegate = self;
    [self.view addSubview:_tableView];
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return _dataArray.count;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellID = @"cell";
    AppCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];
    if(cell == nil)
    {
        cell = [[AppCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellID];
    }
    //config cell
    AppModel *model = _dataArray[indexPath.row];
    //cell.textLabel.text = model.name;
    cell.nameLabel.text = model.name;
    
    [cell.iconImageView setImageWithURL:[NSURL URLWithString:model.iconUrl]];
    
    
    return cell;
}
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 80;
}

 

SDWebImage的使用 

 

 

  <1> 导入库的文件

 

  <2> 如何在ARC工程中使用非ARC的代码???

 

  解决:  在SDWebImage源码文件中禁止ARC功能

 

  工程配置-->Targets-->Build Phases--> Compile Source

 

  搜索文件SD,Cache, 得到的文件添加标志   -fno-objc-arc

 

  包含: #import "UIImageView+WebCache.h"

 

 

技术分享

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。