我的应用程序有一个导航控制器,可以推送和弹出一系列视图。其中一个tableView从URL加载.xml文件,需要4-5秒。如果我点击导航栏上的后退按钮,它只会在表格内容加载完成后才会做出响应。有没有简单的方法异步加载内容,以便应用程序仍然会响应我在导航栏上的手势? p.s.我在互联网上搜索这个,人们都在谈论多线程。我对线程了解不多,所以请更具体一些。iphone dev - 异步加载表格内容
回答
您应该异步重新加载远程数据。 Here您可以找到有关如何使用NSURLRequest和委托对象加载数据的其他信息。在这种情况下,您的应用程序不会卡住,直到文件完全加载(或发生超时/错误)。
您可能需要实现多线程解决方案。多线程应用程序的主题是巨大的和一个详细的答案,因此会导致一本书,其中的其他内容可能更好地描述在其他地方。
基本知识将涉及一个或多个“worker”线程,用于获取XML文件并在信息可用时向主线程报告。为iPhone/iPad实现这一点不应该太难,因为操作系统提供了许多线程原语,使开发人员可以更轻松地完成这项工作。
苹果XMLPerformance示例应用程序专门编写的演示如何通过libxml2
SAX解析器解析XML(通过流)。使用流解析器对于快速异步更新以及保持应用程序内存配置文件较低很有用。
如果您将XML数据放入核心数据存储中,并将表视图挂接到NSFetchedResultsController
及其委托方法,则可以使用非常少的代码使表格持续更新。核心数据和抓取的结果控制器远远超出了本答案的范围,但您可以搜索Stack Overflow和Google以获取有关这些主题的更多信息。
为了简单起见,您可以将数据放入NSMutableArray
,并在数组状态更改时重新加载表视图或特定部分和行,但您必须自己管理表视图更新。请注意,除了数据模型之外,处理视图会很快变得复杂;点击后退按钮将会导致视图控制器以及任何相关的属性被释放,所以你需要小心地管理取消你的视图控制器的XML解析,并且管理驻留在你的数据模型的任何分配的内存视图控制器。否则,一旦视图控制器完全释放,您将遇到内存泄漏或访问已释放对象的异常。
为了让自己更轻松,您需要阅读NSOperation
,NSOperationQueue
和KVO,这将帮助您跟踪操作状态并在视图控制器弹出之前进行清理。 NSOperation
类可以很容易地在后台运行作业。还有其他的手动方式来进行穿线和锁定,但它们几乎不如NSOperation
那样令人愉快和干净。
Apple's NSOperation
documentationApple's NSOperation
documentation将帮助您大大减少测试应用程序的开发难度,让您的各种框架和类别都能让您的应用程序更上一层楼。
请看Apple的LazyTableImages示例代码。它正是使用线程完成的。也看看this SO question的答案。
这个其他SO answer provides code为一个remoteImage类,我用这个,它工作得很好。
- 1. 异步加载Div的内容
- 2. 异步加载网页内容
- 3. 分页内容的异步加载
- 4. 异步加载网站内容
- 5. iphone异步文件加载?
- 6. 异步加载所有单元格内容
- 7. IPhone - 下载异步工作,但加载异步不要
- 8. 在iPhone上异步加载图像
- 9. 异步图像加载为iPhone
- 10. 异步纹理加载iPhone OpenGL ES 2
- 11. 在iPhone上UITableView异步加载JSON
- 12. iPhone中的异步图像加载?
- 13. 异步加载Google图表?
- 14. ScrollView内容异步下载问题
- 15. 添加内容到DOM后,AngularJS已完成异步加载
- 16. 在异步JavaScript中加载外部跨域HTML内容与异步JavaScript?
- 17. 异步加载
- 18. 异步从URL下载iPhone
- 19. iPhone中的异步下载
- 20. 添加内容异步(线程+ AJAX)
- 21. 异步加载内容没有更新文件更改
- 22. 异步加载完整分区的内容
- 23. $(document).ready在异步加载的内容中等效
- 24. 加载内容异步时,JavaScript无法识别我的功能?
- 25. 在jQuery.ajax的beforeSend中加载异步内容
- 26. 使用ajax异步加载内容到页面
- 27. 在所有内容异步加载后捕获页面
- 28. 如何使用jQuery加载异步内容页面?
- 29. 异步加载内容在Windows Mobile 6.5中的C#
- 30. 剑道分离器控制异步加载右面板内容
thx!我想我现在使用你提供的代码工作。 – Brian 2010-05-18 19:54:03