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


    三、结束语
    好的程序,需要一步步跟,理清程序的思路,解析每一步骤。

  • 相关阅读:
    WinForm控件之【Button】
    P4168 蒲公英 题解
    U91741 题解
    树链剖分 学习笔记
    GCD 及 EXGCD 复习笔记
    javascript中的对象拷贝
    关于Vue.js的v-for,key的顺序改变,影响过渡动画表现
    ajax无刷新上传和下载
    站点开启https和http2
    windows挂载EFI分区
  • 原文地址:https://www.cnblogs.com/lisa090818/p/3435527.html
Copyright © 2020-2023  润新知