博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS之网络数据下载和JSON解析
阅读量:7253 次
发布时间:2019-06-29

本文共 5465 字,大约阅读时间需要 18 分钟。

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

简介

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

  涉及到的知识点:

  1.NSURLConnection异步下载和封装

  2.JSON格式和JSON格式解析

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

内容

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

  什么是网络应用?

    一般情况下,应用都需要加载数据,而所有需要网络加载数据的应用都可以称为网络应用

  网络应用的程序结构

    

  常见的网络接口形式

  常见的数据格式

  界面开发的一般流程

2.NSURLConnection使用

  NSString同步下载数据

//HTTP中使用的URL地址    // http:// 地址使用的协议    // iappfree.candou.com 主机地址(域名和IP)    // :8080  主机端口    // free/applications/limited  网页程序文件路径    // ?currency=rmb&page=1&category_id= 程序参数(参数用&分割)    NSString *urlString = @"http://iappfree.candou.com:8080/free/applications/limited?currency=rmb&page=1&category_id=";    // 下载数据    // 通过地址生产NSURL对象    NSError *error = nil;    NSURL *url = [NSURL URLWithString:urlString];    NSString *content = [[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];    if (error == nil) {        NSLog(@"connent = %@",content);    }    else    {        NSLog(@"下载失败");    }

 

#pragma mark - 异步下载- (void)testNSStringAsyncDownloadData{    NSString *urlString = @"http://iappfree.candou.com:8080/free/applications/limited?currency=rmb&page=1&category_id=";    // 初始化    _data = [[NSMutableData alloc] init];    //发起了一个异步的URL连接请求    //异步:执行了方法之后开始下载,立即返回    //     下载过程在后台(多线程)执行    _connection = [[NSURLConnection alloc] initWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:urlString]] delegate:self startImmediately:YES];    NSLog(@"initWithRequest 执行完成");}//代理方法:接收到服务器响应执行- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{    NSLog(@"接收到服务器响应执行");}//代理方法:接收到数据的时候执行//注意:当数据比较大,可能多次执行- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{    [_data appendData:data];}//代理方法:数据下载完成了- (void)connectionDidFinishLoading:(NSURLConnection *)connection{    NSString *str = [[NSString alloc] initWithData:_data encoding:NSUTF8StringEncoding];    NSLog(@"str = %@",str);        //解析JSON    //作用:JSON数据转化为NSArray 或 NSDictionary    NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:_data options:NSJSONReadingMutableContainers error:nil];//    NSLog(@"%@",dict);    NSArray *appList = dict[@"applications"];    for (NSDictionary *appDict in appList) {        NSLog(@"name = %@",appDict[@"name"]);    }    }//下载失败调用- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{    NSLog(@"error = %@",error);}//  NSURLConnection同步下载- (void)testNSStringSyncDownloadData{    NSString *urlString = @"http://iappfree.candou.com:8080/free/applications/limited?currency=rmb&page=1&category_id=";    // 发送同步URL请求    // NSURLResponse URL请求对象    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);    }    else    {        NSLog(@"下载失败");    }}// 同步下载- (void)testNSStringDownloadData{    //HTTP中使用的URL地址    // http:// 地址使用的协议    // iappfree.candou.com 主机地址(域名和IP)    // :8080  主机端口    // free/applications/limited  网页程序文件路径    // ?currency=rmb&page=1&category_id= 程序参数(参数用&分割)    NSString *urlString = @"http://iappfree.candou.com:8080/free/applications/limited?currency=rmb&page=1&category_id=";    // 下载数据    // 通过地址生产NSURL对象    NSError *error = nil;    NSURL *url = [NSURL URLWithString:urlString];    NSString *content = [[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];    if (error == nil) {        NSLog(@"connent = %@",content);    }    else    {        NSLog(@"下载失败");    }}

由于下载程序经常使用,可以将其封装起来,以便调用。以下是封装了下载程序块:

#import "ZYHttpRequest.h"//消除performSelector的警告#pragma clang diagnostic ignored "-Warc-performSelector-leaks"// 类扩张// 项目实践://  有些实力变量内部使用,不想放在头文件中,放在这(.m文件)@interface ZYHttpRequest ()
{ NSURLConnection *_connetion; NSString *_url; id _target; SEL _action;}@end@implementation ZYHttpRequest//作用:传入网址,下载完成后执行target对象中action方法- (void)requestWithUrl:(NSString *)url target:(id)target action:(SEL)action{ _url = url; _target = target; _action = action; //发起URL请求 异步请求 _data = [[NSMutableData alloc] init]; _connetion = [[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]; }}@end

 

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

     // JSON

     // JavaScript Object Notation

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

     // ,  表示并列的数据

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

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

     // 20  对应NSNumber

 

//解析JSON    //作用:JSON数据转化为NSArray 或 NSDictionary    NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:_data options:NSJSONReadingMutableContainers error:nil];//    NSLog(@"%@",dict);    NSArray *appList = dict[@"applications"];    for (NSDictionary *appDict in appList) {        NSLog(@"name = %@",appDict[@"name"]);

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

效果图:

 

转载于:https://www.cnblogs.com/monian0313/p/4384498.html

你可能感兴趣的文章
主表和子表主键设计
查看>>
为什么Redis比Memcached易
查看>>
add .json handler support in IIS 7
查看>>
String当中的高效函数(优化)
查看>>
QQ拼音在中文输入下默认英文标点
查看>>
hadoop MapReduce - 从作业、任务(task)、管理员角度调优
查看>>
JVM 类加载过程
查看>>
PL/SQL连接Oracle客户端步骤
查看>>
关于在 mac上配置pytesseract的相关问题
查看>>
解决eclipse复制粘贴js代码卡死的问题
查看>>
【BZOJ】1513: [POI2006]Tet-Tetris 3D
查看>>
【BZOJ】2172: Mario填格子
查看>>
关于格式化字符串日期
查看>>
Http Cookie Manager、session
查看>>
学习汇编语言
查看>>
rabbitmq例子
查看>>
[转]js中confirm实现执行操作前弹出确认框的方法
查看>>
域滤波:方框、高斯、中值、双边滤波
查看>>
github创建tag
查看>>
token生成过程
查看>>