iphone dev - 异步加载表格内容
Posted
技术标签:
【中文标题】iphone dev - 异步加载表格内容【英文标题】:iphone dev - loading table content asynchronously 【发布时间】:2010-05-18 18:31:55 【问题描述】:我的应用有一个导航控制器,它可以推送和弹出一系列视图。其中一个 tableViews 从 URL 加载 .xml 文件,需要 4-5 秒。如果我点击导航栏上的后退按钮,它只会在表格内容加载完成后才会响应。是否有一种简单的方法来异步加载内容,以便应用程序仍会响应我在导航栏上的手势? p.s.我在互联网上搜索这个,人们正在谈论多线程。我对线程了解不多,所以请更具体。
【问题讨论】:
【参考方案1】:您应该异步重新加载远程数据。 Here 您可以找到有关如何使用 NSURLRequest 和委托对象加载数据的更多信息。在这种情况下,您的应用程序在文件完全加载(或发生超时/错误)之前不会卡住。
【讨论】:
【参考方案2】:Apple 的XMLPerformance 示例应用程序专门用于演示如何通过libxml2
SAX 解析器(通过流)解析XML。使用流解析器对于快速异步更新以及保持应用的低内存配置很有用。
如果您将 XML 数据放入 Core Data 存储中,并将您的表视图连接到 NSFetchedResultsController
及其委托方法,您可以使用很少的代码让您的表持续更新自身。 Core Data 和 fetched results controller 远远超出了此答案的范围,但您可以搜索 Stack Overflow 和 Google 以获取有关这些主题的更多信息。
为简单起见,您只需将数据放入 NSMutableArray
并在数组状态更改时重新加载表格视图或特定部分和行,但您必须自己管理表格视图更新。
请注意,除了数据模型之外,处理视图会很快变得复杂;单击后退按钮将导致视图控制器以及任何关联的属性被释放,因此您需要小心管理取消从视图控制器解析 XML 并管理驻留在中的数据模型的任何分配内存视图控制器。否则,一旦视图控制器完全释放,您将遇到内存泄漏或访问释放对象的异常。
为了让自己更轻松,您需要阅读 NSOperation
、NSOperationQueue
和 KVO,它们将帮助您跟踪操作状态并在视图控制器弹出之前进行清理。 NSOperation
类使在后台运行作业变得容易。还有其他手动方式来进行线程和锁定,但它们不像NSOperation
那样令人愉快和干净。
阅读Apple's NSOperation
documentation 将极大地帮助您,并通过执行较小的测试应用程序来熟悉各种框架和类,从而使您的应用程序更复杂。
【讨论】:
【参考方案3】:查看 Apple 的 LazyTableImages 示例代码。它使用线程正是这样做的。另请查看this SO question 的答案。
另一个SO answer provides code 用于一个remoteImage 类,我已经用它来做这个并且效果很好。
【讨论】:
【参考方案4】:您可能需要实施多线程解决方案。多线程应用程序的主题是巨大的,并且这样的详细答案将产生一本书,无论如何,其他地方可能会更好地描述它。
基础知识将涉及一个或多个“工作”线程,这些线程获取 XML 文件并在信息可用时向主线程报告。为 iPhone/iPad 实现这一点应该不会太难,因为操作系统提供了许多线程原语,使开发人员的这项工作变得更加容易。
【讨论】:
【参考方案5】:你应该看看NSURLConnection
一定要实现:
- (void)connectionDidFinishLoading: (NSURLConnection*)connection
【讨论】:
以上是关于iphone dev - 异步加载表格内容的主要内容,如果未能解决你的问题,请参考以下文章
在 UITableView 中的 iPhone 上异步加载 JSON