2011-04-19 51 views
0

所以這是我的問題。 在我的應用程序的主頁我有一個簡單的UITableView,可以容納最多3個部分,2個部分每個最多3個項目,第三部分可以容納最多6個項目。重裝數據同步問題

每個部分都有一個標題與。

實際的內容來自web,我提出請求,服務器發送數據,我用NSXMLParser解析響應,創建數組來保存每個部分的數據(3個數組),並且還創建另一個數組來保存我將不得不展示的部分。

然後,最後,我調用[myTableView reloadData]刷新內容並重繪表格。 用戶也可以自行更新內容。爲此,我正在使用像Facebook應用程序一樣的「拉到刷新」機制。

使用pull-to-refresh刷新內容也最終調用[myTableView reloadData]。 當我刷新我的內容並且表需要更改其佈局時(例如:表格當前擁有所有3個部分,並且在我重新裝入數據後它將只顯示一個部分)時,我正在經歷一次令人討厭的崩潰。

我用調試器來追蹤問題。以下是我發現:

  1. 用戶向下拉動整個表等50個像素,然後釋放
  2. 的動畫開始,帶來了表「向上」,以容納320x50的視圖中顯示一個「加載」消息+動畫在桌子上
  3. 刷新觸發頂部的UIActivityIndi​​catorView,我做一個後臺任務了新的Web服務請求,獲取新的數據,分析,更新陣列,終於在主線程中執行reloadData
  4. 在此期間,同時刷新正在做所有我注意到,UITableView STILL發送代理消息到:
    • 的tableView:viewForHeaderInSection:
    • 的tableView:的cellForRowAtIndexPath:

我想,這是因爲拉來刷新動畫的是 「動作」 表並揭示了新的細胞/頭,從而稱呼上述。

問題是,這會導致可怕的崩潰,因爲保存數據的部分和部分數組本身的數組看起來是同時修改的。

發生這種情況時,委託方法可能會在錯誤的上下文中使用更新/尚未更新的items/sections數組。也就是說,前

  • numberOfSectionsInTableView:
  • 的tableView:numberOfRowsInSection:

曾經有機會正確更新新的結構更新的陣列。我知道如果我已經知道這個問題(至少我希望我這樣做),並且如果有人看到我的觀點,也許有人可以指引我朝着正確的方向前進糾正這個同步問題。

感謝您的閱讀!

以後編輯

我發現那裏的問題了。我拉來刷新機制使用stopLoading回調,看起來像這樣:

- (void)stopLoading 

{ isLoading = NO;

// Hide the header 
[UIView beginAnimations:nil context:NULL]; 
[UIView setAnimationDelegate:self]; 
[UIView setAnimationDuration:0.3]; 
[UIView setAnimationDidStopSelector:@selector(stopLoadingComplete:finished:context:)]; 
self.myTableView.contentInset = UIEdgeInsetsZero; 
[refreshArrow layer].transform = CATransform3DMakeRotation(M_PI * 2, 0, 0, 1); 
[UIView commitAnimations]; 

}

在某些時候,我重置contentInset我的表在UIEdgeInsetsZero設置它。 這和在主線程上返回後臺刷新後我調用stopLoading之前的事實reloadData - 在錯誤的時刻觸發了錯誤的代表回調。

所以這是我的表的contentInset和reloadData更改之間的時間問題。

回答

0

聽起來好像您正在更新用於不同線程的表視圖的數據存儲。這不是一個好主意 - 數據可能很容易陷入不一致的狀態,而且您正在使用的容器可能無法保證線程安全。

正確的方法是僅從主線程更新此數據。此外,你可能想看看插入行等方法,這使得很少需要完整的重新加載。如果你只是想因爲新數據而更新一個單元,那麼只需要刷新單元。

+0

嗯,是的。我正在考慮在實際編寫問題時更新不同線程中的集合(即NSXMLParser中的didEndDocument:方法)。所以我在readeData之前解析結束之後更新了我的performSelectorOnMainThread方法中的結構。還是一樣。 reloadData沒有機會更新sourceDelegate,因爲其他委託方法是使用更新的結構調用的,但是基於舊的sourceDelegate。 – TeodorC 2011-04-19 15:38:57