先收着,
转:
近来想了解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;
三、结束语
好的程序,需要一步步跟,理清程序的思路,解析每一步骤。
转:关于LazyTableImage,布布扣,bubuko.com
原文地址:http://www.cnblogs.com/NatureZhang/p/3753884.html