网络数据的下载(NSUrlconnection异步下载和NSstring同步下载)和UI界面数据的刷新(都是抛弃第三方库的一些本质)

<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];

原文地址:https://www.cnblogs.com/ZSongChao001/p/4957323.html