我的應用程序有一個導航控制器,可以推送和彈出一系列視圖。其中一個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