2011-10-04 47 views
1

我需要以固定間隔異步解析XML,以便當用戶使用「PullToReload」重新加載UITableView時,它會加載更新後的值。我敢打賭使用的NSTimer ...什麼是使用NSTimer在後臺解析XML的最佳方式

我已經有一個XML解析器使用TBXML:

- (void) xmlParserWrapper 
{ 
... 
TBXMLParser *xmlParser = [[TBXMLParser alloc] initWithContext:context]; 
[xmlParser performSelectorInBackground:@selector(parseXMLFileAtURL:) withObject:xmlUrl]; 
} 

所以我嘗試使用的NSTimer

{ 
... 
[NSTimer scheduledTimerWithTimeInterval:30 target:self selector:@selector(xmlParserWrapper) userInfo:nil repeats:YES]; 
} 

這工作得很好,只要在用戶中贏得」在解析時觸摸GUI。但是當用戶點擊UITableViewCell時,它需要將新的UITableView推送到UINavigationController並根據所選單元格值提取數據;因爲NSManagedContext在解析過程中是空的(直到它被填充),應用程序因'無效謂詞:無RHS'而崩潰。

我的代碼現在變得非常大,所以我不能真正將它粘貼在這裏,但請讓我知道你需要看哪些代碼部分,我會把它放在這裏。

基本上,我只需要有一個定期的後臺XML解析,不會導致應用程序崩潰。我還需要它在另一個線程中,以便在用戶導航到UI時不會阻塞MainThread。

由於提前, dfox

回答

0

我不是iOS的專家,但是這個問題是很常見的任何GUI框架,它一般使用的背景下,或工人,線程來執行耗時的任務得到解決留下主要的GUI線程來處理用戶交互。

您的解決方案應該如下:

  1. 創建工作線程應用程序啓動時。
  2. 使用容器(列表)類來包含將向其發佈工作線程工作的'工作隊列'。您需要實現自己的類或結構來描述每個工作單元的執行情況。
  3. 使用同步機制來控制從兩個線程訪問工作隊列。
  4. 在工作線程中實現儘可能多的工作(即讓它檢索以及解析XML)。我以爲網絡訪問是最耗時的任務。
  5. 獲取工作線程以使用新內容更新UI元素。這裏還有一個同步問題需要解決。
  6. 終止應用程序終止時的工作線程。

在線程上看到這個Apple Documentation關於在iOS下實現這個的介紹。

+0

感謝您的建議,我會盡力處理並嘗試實施。我深入探究當前的問題,我注意到當我嘗試加載新數據時。我現有的變量'@property(retain,non-atomic)NSMutableArray * entityArray'變空。我會嘗試一下你的建議,看看我能否再進一步。 謝謝 – dfox

相關問題