我的应用程序有一个导航控制器,可以推送和弹出一系列视图。其中一个tableViews从URL加载.xml文件,需要4-5秒。如果我单击导航栏上的back按钮,它只会在表的内容加载完成后才会响应。有没有一种简单的方法可以异步加载内容,这样应用程序仍然会响应我在导航栏上的手势?附注:我在互联网上搜索了一下,人们都在谈论多线程。我对线程了解不多,所以请具体一点。
发布于 2010-05-19 02:40:29
您应该异步重新加载远程数据。有关如何通过委托对象使用NSURLRequest加载数据的详细信息,请参阅Here。在这种情况下,直到文件完全加载(或者发生超时/错误),您的应用程序才会停滞。
发布于 2010-05-19 03:11:13
苹果的XMLPerformance示例应用程序专门用来演示如何通过XML解析器(通过流)解析libxml2。使用流解析器对于快速、异步更新以及保持应用程序的内存配置文件较低都很有用。
如果将可扩展标记语言数据放入核心数据存储中,并将表视图与NSFetchedResultsController及其委托方法连接起来,那么只需很少的代码就可以使表不断地自我更新。核心数据和fetched results控制器远远超出了本答案的范围,但您可以搜索Stack Overflow和Google以获取有关这些主题的更多信息。
为了简单起见,您可以将数据放入NSMutableArray中,并在数组状态更改时重新加载表视图或特定部分和行,但您必须自己管理表视图更新。
请注意,除了数据模型之外,处理视图可能很快就会变得复杂;单击back按钮将导致释放视图控制器以及任何相关的属性,因此您需要小心地管理从视图控制器取消XML解析的操作,并管理为驻留在视图控制器中的数据模型分配的任何内存。否则,一旦视图控制器完全释放,就会在访问释放的对象时遇到内存泄漏或异常。
为了方便您自己,您需要阅读NSOperation、NSOperationQueue和KVO,它们将帮助您跟踪操作状态,并在视图控制器弹出之前进行清理。NSOperation类使得在后台运行作业变得很容易。还有其他手动执行线程和锁定的方法,但它们并不像NSOperation那样令人愉快和干净。
阅读Apple's NSOperation documentation将极大地帮助您,以及进行较小的测试应用程序,让您接触各种框架和类,使您的应用程序达到更高的复杂性水平。
发布于 2010-05-19 07:48:03
看一看苹果的LazyTableImages示例代码。它正是使用线程来做到这一点的。另请看this SO question的答案。
用于remoteImage类的另一个SO answer provides code,我为此使用过它,它工作得很好。
https://stackoverflow.com/questions/2859955
复制相似问题