网络数据的下载(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];

时间: 2024-10-12 21:52:10

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

iOS网络编程——Day4(使用NSURLConnection异步方式获取数据)

XCode7使用HTTPS通信,在info.plist文件中加一个属性@{@"NSAppTransportSecurity":@{@"NSAllowsArbitraryLoads":YES}} 接口网站:http://www.webxml.com.cn xml  国际标准 json 流行标准 get: 使用简单,接口外露不安全 //QQ在线查询的接口宏定义GET#define QQOnlineURL_GET @"http://webservice.webx

MVVM模式的UI界面数据返回问题

MVVM模式里面用户UI界面的数据返回问题,让我纠结了好几天,一直得不到数据,今天总算能取到UI界面的数据了! 我采用的是ListView显示数据和Prism模式,并且将数据显示成了大图标的样式,即水平显示,但是下面测试用的我就没有采用水平显示,做了简单Model. XAML 代码: <ListView ItemsSource="{Binding ProductList}" x:Name="lv" Margin="8,8,8,37.96"

iOS基础8:自定义MyData/自定义SQLite用于网络判断,版本判断,图片缓存处理,下载或者上传的GET或POST请求,加密手段,.数据解析

镔哥,这篇文章是用自己的工程项目来的,主要是代码为主,但是会有注释,让大家能更好理解,让大家做工程更多一个选择,这其实就是自己自定义SQLite,不多说,见代码例子 MyDAta的.h文件 /* MyData这一个基本上每个工程都能用到的Demo,他包含了很多内容: 1.iPhone机网络判断: 2.iPhone机软件版本判断(主要是看是否是大于IOS7): 3.图片缓存处理: 4.下载或者上传的GET或POST请求: 5.加密手段: 6.数据解析: */ //*****************

Swift正在使用NSURLConnection异步下载同步(实例解析)

原版的blog.转载请注明出处 http://blog.csdn.net/hello_hwc 一.同步异步两个概念 简单来讲.同步就是函数或者闭包(objective c中的block)运行完成才干返回. 异步是立马返回,然后异步运行的动作结束后.再进行回调. 二.同步下载 同步下载: class func sendSynchronousRequest(_ request: NSURLRequest, returningResponse response:AutoreleasingUnsafeM

ios开发网络学习四:NSURLConnection大文件断点下载

#import "ViewController.h" @interface ViewController ()<NSURLConnectionDataDelegate> @property (weak, nonatomic) IBOutlet UIProgressView *progressView; @property (nonatomic, assign) NSInteger totalSize; @property (nonatomic, assign) NSInte

iOS多线程与网络开发之大文件下载 (边下边写/暂停恢复下载/压缩解压zip/多线程下载)

郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. 如果文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额随意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源码下载:点我传送 游戏官方下载:http://dwz.cn/RwTjl 游戏视频预览:http://dwz.cn/RzHHd 游戏开发博客:http://dwz.cn/RzJzI 游戏源码传送:http://dwz.cn/Nret1 A.需求 边下边写入硬盘 显示下载进度 暂停/恢复 下载 解压文件 多线程下载 B.基本知识 1

同步下载 异步下载

异步下载:支持应用程序在后台下载数据,在等待下载完成的过程中不会阻塞代码的运行 同步下载:调用一个方法的时候,如果该方法的返回依赖于它的功能是否完成,则称该方法为同步方法.必须下载完成才能进行下一步.会出现卡壳现象. 同步下载几种形式: NSURL *url=[NSURL URLWithString:@"http://www.baidu.com"]; 形式一: NSString *str=[NSString stringWithContentsOfURL:url encoding:NS

libcurl的封装,支持同步异步请求,支持多线程下载,支持https

最近在做一个项目,需要用到http get post等 需求分析需要做到同步和异步,异步请求的返回以可选的回调通知的方式进行. 本人以Linux为例,一步一步的来实现. 配置并且编译libcurl我以在Linux底下的交叉编译举例.libcurl源码下载: http://curl.haxx.se/download.html配置libcurl支持https和zlib压缩,必须需要openssl和zlib库openssl库源码下载: http://www.openssl.org/source/.下载

Android实战开发租赁管理软件(适配UI,数据的存储,多线程下载)课程分享

亲爱的网友,我这里有套课程想和大家分享,假设对这个课程有兴趣的,能够加我的QQ2059055336和我联系. 课程内容简单介绍 我们软件是基于移动设备的.所以我们必定的选择了安卓作为我们的开发工具.课程中,我们将简要的介绍Android的基本概念,然后进行我们的实战开发.在开发中,大家讲学习到主要的组件,适配UI,数据的存储,多线程下载,开机广播,闹钟提醒,短信发送等实际项目开发中碰到的实用的知识点.通过课程学习,让大家可以掌握Android软件开发的流程,注意点,及优化.帮助大家迅速的掌握An