LazyTableImages范例解析
近来想了解iPhone的多线程处理,查阅到了官方范例LazyTableImages,发现代码中有不仅有多线程处理,还有XML解析和异步下载图片,感觉官方例子真是全面啊,便花了时间好好研究下。
LazyTableImages地址:
http://developer.apple.com/library/ios/#samplecode/LazyTableImages/Introduction/Intro.html
一、程序的运行效果

二、程序的思路
多线程的好处即提高程序执行效率,防止界面阻塞。
1、进入程序后,建立给定网址(RSS feed)的连接,程序会自动下载对应的RSS feed数据,如果网络连接无误,数据自动全部下载,这是XCode提供的内部回调函数。
2、建立一个线程,把下载好的数据传递给新建线程,把此线程添加到线程队列,利用XCode的delegate等待线程结束后返回被处理后的数据。
3、在创建的线程中用NSXMLParser根据程序要求分析下载的数据,并添加到数组中。全部解析之后,通知AppDelegate
4、程序AppDelegate接到解析成功通知后,根据解析好的数组,执行performSelectorOnMainThread(否则界面控件无变化)更新程序UI界面
5、主界面rootViewController的table view根据解析的数组重新载入,根据传递进来的数组更新每个单元格
6、如果单元格中的图片没有数据而只有网址,根据此单元格针对的图片,创建对应的下载对象IconDownloader,同时把此对象和行描述添加到字典imageDownloadsInProgress(以备检测是否重复下载)中,并开始下载
7、下载对象下载完图片后,通知Table view更新对应的table cell
8、界面完成
注:
1、网络连接状态检测(程序中处理比较简单)
NSURLRequest *urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:TopPaidAppsFeed]];
self.appListFeedConnection = [[[NSURLConnection alloc] initWithRequest:urlRequest delegate:self] autorelease];
NSAssert(self.appListFeedConnection != nil, @"Failure to create URL connection.");
2、子线程中处理的数据,更新到主界面界面的控件需要执行
[self performSelectorOnMainThread:@selector(handleLoadedApps:) withObject:appList waitUntilDone:NO];
3、每次只下载一屏显示的单元格图片
- (void)loadImagesForOnscreenRows
{
NSArray *visiblePaths = [self.tableView indexPathsForVisibleRows];
}
4、拖动或滚动table view时,图片不下载
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
5、有按给定尺寸处理图片的代码
UIImage *image = [[UIImage alloc] initWithData:self.activeDownload];
if (image.size.width != kAppIconHeight && image.size.height != kAppIconHeight)
{
CGSize itemSize = CGSizeMake(kAppIconHeight, kAppIconHeight); UIGraphicsBeginImageContext(itemSize);
CGRect imageRect = CGRectMake(0.0, 0.0, itemSize.width, itemSize.height);
[image drawInRect:imageRect];
self.appRecord.appIcon = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
}
6、注意内存释放和错误处理
7、变量所有权变更以后,即两个程序中共享对象,要及时的释放
ParseOperation *parser = [[ParseOperation alloc] initWithData:appListData delegate:self];
self.appListData = nil;
三、结束语
好的程序,需要一步步跟,理清程序的思路,解析每一步骤。
LazyTableImages范例解析的更多相关文章
- XML.03-DOM和SAX解析
body,td { font-family: calibri; font-size: 10pt } XML.03-DOM和SAX解析 XML的DOM解析 解析 处理 回写 XML的SAX解析 SAX和 ...
- C++使用throw抛出异常
引用: c++ 使用throw抛出异常 抛出异常(也称为抛弃异常)即检测是否产生异常,在C++中,其采用throw语句来实现,如果检测到产生异常,则抛出异常.该语句的格式为:throw 表达式; ...
- iOS:UIScrollView控件和UIPageControl控件的详解
UIScrollView滚动视图控件和UIPageControl分页视图控件: UIScrollView用于显示多于一个屏幕的内容,超出屏幕范围的内容可以通过滑动进行查看,当然UIPagecon ...
- CUE 文件格式说明
CUE 文件,即 CUESheets ,光盘镜像辅助文件.通常用于光盘刻录.音乐播放等等. 比如用 EAC 刻录CD光盘,或者用 Foobar2000 播放整轨音乐文件. CUE 文件是非常好的音乐专 ...
- WebService(2)-XML系列之用Stax操作Xml
源代码下载:链接: http://pan.baidu.com/s/1ntL1a7R password: rwp1 本文主要讲述:利用Stax处理xml文档 一.读取xml 1.基于光标的查找 核心:X ...
- 2019-2020-1 20199308《Linux内核原理与分析》第二周作业
<Linux内核分析> 第一章 计算机工作原理 1.1 存储程序计算机工作模型 冯·诺依曼体系结构 各种计算机体系结构需要遵从的一个"客观规律" 结构图 冯·诺依曼体系 ...
- Java XML DOM解析范例源码
下边内容内容是关于Java XML DOM解析范例的内容.import java.io.InputStream; import java.util.ArrayList; import java.uti ...
- 解析苹果的官方例子LazyTableImages实现图片懒加载原理
解析苹果的官方例子LazyTableImages实现图片懒加载原理 首先在官网下载源码: https://developer.apple.com/library/ios/navigation/#sec ...
- 面试必备:高频算法题终章「图文解析 + 范例代码」之 矩阵 二进制 + 位运算 + LRU 合集
Attention 秋招接近尾声,我总结了 牛客.WanAndroid 上,有关笔试面经的帖子中出现的算法题,结合往年考题写了这一系列文章,所有文章均与 LeetCode 进行核对.测试.欢迎食用 本 ...
随机推荐
- 微信小程序 wx.request POST请求------中文乱码问题
问题: 一个简单的表单,提交后台返回数据“提交成功”. 以为没问题了,但是没过多久后台小哥就问为啥那么多乱码,找了很久原因,发现在提交的时候就已经乱码了. 嗯,前端问题,然后测试GET/POST方法. ...
- 【编码】【转发】enca 转换编码
enca用法如下: enca -L zh_CN file 检查文件的编码 enca -L zh_CN -x UTF-8 file 将文件编码转换为"UTF-8"编码 enca -L ...
- 使用VMware克隆出来的新虚拟机无法联网-问题解决记录
背景: 使用VMware克隆出来的新虚拟机无法联网,重启网卡出现如下图提示: 继续输入#ifup ens33 提示: ens33: unknown interface: No such device ...
- leetcode-3-basic-divide and conquer
解题思路: 因为这个矩阵是有序的,所以从右上角开始查找.这样的话,如果target比matrix[row][col]小,那么就向左查找:如果比它大,就 向下查找.如果相等就找到了,如果碰到边界,就说明 ...
- java 位向量
public class BitVectory { private int count; private int[] a; private static final int BIT_LEN = 32; ...
- vue.js+element-ui
git地址:https://github.com/jerry9022/LitAdmin vue.js+element-ui 做后台管理系统 太方便了
- python基础-range和xrange的区别
range(start,stop,step): 1.用于循环时使用,可以给定开始,结束,和步长 例如: >>> for i in range(2,10,2):... print i, ...
- 干货 | Elasticsearch Nested类型深入详解
在Elasticsearch实战场景中,我们或多或少会遇到嵌套文档的组合形式,反映在ES中称为父子文档. 父子文档的实现,至少包含以下两种方式: 1)父子文档 父子文档在5.X版本中通过parent- ...
- gevent 使用踩坑
简单介绍 gevent 基本概念: 调度器: hub 上下文切换管理: switch 主循环: loop 协程: greenlet gevent 特性: ...
- java面试题之能创建volatile数组吗?
答:能,只不过只是一个指向数组的引用,而不是整个数组,如果改变了引用指向的数组,将会受到volatile的保护,但是如果多个线程同时改变数组的元素,volatile关键字就不能起到保护的作用.