<1>NSString同步下载
//字符串的类方法,会根据url向服务器发起同步的数据请求,并将请求结果作为返回值
//同步请求数据,会对程序的UI主线程造成阻塞,用户体验极差
NSString *str = [NSString stringWithContentsOfURL:[NSURL URLWithString:kUrl] encoding:NSUTF8StringEncoding error:nil];
//json格式的数据 进行json解析 数据最外层是 字典 用NSDictionary接收
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:[str dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingMutableContainers error:nil];
1、字符串同步处理函数:
+ (id)stringWithContentsOfURL:(NSURL *)url encoding:(NSStringEncoding)enc error: (NSError **)error;
2、二进制同步读取函数:
+ (id)dataWithContentsOfURL:(NSURL *)url;
3、图片同步下载函数:
+ (id) imageWithContentsOfFile:(NSString *)path;
<2>NSURLConnection异步下载[核心和重点, 项目中使用]
NSURLConnection 一旦创建 立即会启动一个子线程(子线程 来建立 客户端和服务端的连接 和接收数据等,主线程 主要还是负责界面的数据刷新) 把客户端和服务端 连接起来之后 把客户端的请求(get请求:一般用于从服务端获取数据,不安全 :get请求 需要把 服务端的地址和参数 一起捆绑 封装成一个url 发送给服务端) 发送给服务端
异步下载的顺序:
1. 起一个线程(建立连接)由客户端 向 服务端发送请求
2.服务端 给 客户端响应 --》客户端接收响应
3.服务端 开始发送数据--》客户端收数据
4.服务端 发送结束 客户端 接收完毕
下载完之后 客户端来进行解析数据
项目中的综合使用
项目: QFSNS客户端--即时聊天类客户端----类似QQ,微信
需求: 实现一个界面, 显示用户列表
项目: 从下载到显示的完整流程
<1>获取网络接口(服务端提供, 抓包, 开源接口)
http://10.0.8.8/sns/my/user_list.php
http://10.0.8.8/sns/my/user_list.php?page=1&number=20
http://10.0.8.8/sns/my/user_list.php?page=%d&number=%d
<2>异步下载数据
<3>Json解析
<4>建立数据模型并解析
<5>表格视图显示(cell的定制)
<6>SDWebImage异步显示图片
(1)库导入中项目(拖进来即可)
(2) ARC和非ARC混编
如果是ARC项目, SD库是非arc 那么需要设置非ARC编译, -fno-objc-arc
如果工程是非arc的, sd 库 是arc 的那么需要按照arc 编译 -fobjc-arc
(3)导入头文件 #import "UIImageView+WebCache.h"
(4)显示图片 [cell.headImageView setImageWithURL:[NSURL URLWithString:headImageUrl]];
@"http://10.0.8.8/sns/" + imageUrl
/*
SDWebImage 是用arc写 的
当前程序 默认是非arc 的代码 那么这时我们需要进行混合编译
把SDWebImage的源码 在xcode 的build phase 选中 所有的SDWebImage的代码 文件 添加编译标记 -fobj-arc (表示 这些代码使用 arc 编译)
*/
// SDWebImage下载图片是异步的 下载完成之后 会自动放在沙盒 中的Library/Cache/com.hackemist.SDWebImageCache.default 目录下作为缓存,下次再加载同一个 如果缓存有那么就直接从缓存获取,如果没有再异步下载
// SDWebImage自带缓存功能
//在沙盒的Libarary/Cache中创建文件夹ImageCache 所有的图片都会缓存在该文件夹下
// 先去磁盘中判断该图片是否存在 如果存在不下载 不存在下载
SDImageCache * cache = [SDImageCache sharedImageCache];
// 1.内存
[cache clearMemory];
// 1.磁盘
[cache clearDisk];
三、下拉刷新 上拉加载更多
a. UIRefreshControl
/*
iOS6之后
1.创建一个UIRefreshControl 对象 (可以不设置大小和坐标)
2.设置UIRefreshControl 对象 属性 增加 事件(下拉到一定程度松手就会触发事件)
3.粘贴到要刷新的tableView上
4. 实现增加事件触发的方法 (在这个方法内进行刷新数据)
5.数据下载完之后要 停止刷新 [_refreshControl endRefreshing];
*/
//事件驱动型控件
_refreshControl = [[UIRefreshControl alloc] init];
//属性字符串
_refreshControl.attributedTitle = [[[NSAttributedString alloc] initWithString:@"下拉刷新"] autorelease];
//设置背景
_refreshControl.tintColor = [UIColor redColor];
//增加 触发事件 值改变的时候
[_refreshControl addTarget:self action:@selector(updateData:) forControlEvents:UIControlEventValueChanged];
_refreshControl.backgroundColor = [UIColor yellowColor];
//粘贴到tableView
[self.tableView addSubview:_refreshControl];
b. EGO
1.把第三方库导入工程
2.#import "EGORefreshTableHeaderView.h"
3.需要刷新的界面 遵守协议
4.//创建在tableview的上方
- (void)creatEGOHeardView{
_heardView = [[EGORefreshTableHeaderView alloc] initWithFrame:CGRectMake(0, -self.tableView.bounds.size.height, self.tableView.bounds.size.width, self.tableView.bounds.size.height)];
//设置代理
_heardView.delegate = self;
//设置最近刷新时间
[_heardView refreshLastUpdatedDate];
[self.tableView addSubview:_heardView];
}
#pragma mark - 要实现scrollView协议的方法
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
//滚动视图滚动的时候要调用
[_heardView egoRefreshScrollViewDidScroll:scrollView];
}
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
//停止拖拽的时候调·用
[_heardView egoRefreshScrollViewDidEndDragging:scrollView];
}
#pragma mark - EGO 协议中的方法
//返回当前是否正在刷新,如果正在刷新那么就 不刷新了
//返回的是YES 表示正在刷新 那么这个时候就不刷新
//返回的时NO 表示当前没有刷新 可以刷新
- (BOOL)egoRefreshTableHeaderDataSourceIsLoading:(EGORefreshTableHeaderView *)view{
return _isRefreshing;
}
//刷新的时候调用
- (void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView *)view{
if (_isRefreshing) {
return;
}
_isRefreshing = YES;
_currentPage = 1;
[self loadDataPage:_currentPage count:20];
}
//返回最近刷新的时间
- (NSDate *)egoRefreshTableHeaderDataSourceLastUpdated:(EGORefreshTableHeaderView *)view{
return [NSDate date];
}
最后
[self.tableView reloadData];
//设置为NO 表示当前没有下载了
_isLoading = NO;
//刷新结束
_isRefreshing = NO;
//已经完成更新 要停止刷新
[_heardView egoRefreshScrollViewDataSourceDidFinishedLoading:self.tableView];