2008-12-02 215 views
4

我正在使用UITableView來顯示數組中的一些數據。這個數組可以隨時被其他線程改變。 (我相信無論數組是可變的,還是完全替換,都沒有什麼不同。)訪問數組本身是線程安全的。線程安全UITableView

確保線程安全與桌面視圖的正確方法是什麼?例如,我擔心我可能會在調用cellForRowAtIndexPath之前將數組更改爲short,導致出現NSRangeException。

我應該......

  1. 強制該陣列不僅改變了主線程? (看起來醜陋。)
  2. 維護陰影數組並通過KVO觀察在主線程上更新它?
  3. ???必須有一個更好的解決辦法...

回答

6

從你的描述,你真的有兩個不同的數據集:

  • 的實際數據,因爲它在你的模型存在
  • 在顯示的數據給用戶

因此,實際上,你已經有了一個'陰影'數組(虛擬陰影,這可能會使隱喻過度延伸)。我會說你最好的選擇是正式確定這個安排,並保留一個只在主線程中被修改的「顯示」數組。在它裏面,你可以從你的'真實'數組中獲得對象;因爲它們只是指針,所以你不會放棄太多內存。

線程是邪惡的。

+1

我很困惑... – bentford 2010-04-06 23:04:41

1

我有同樣的情況。我有一個C++對象數組,提供tableview中的信息。

正如本人所說,我還有一個臨時的「影子」陣列,通過互聯網下載新的信息。查詢完成後,我將該數組與支持tableview的數組進行協調,這非常快。問題是如何在對帳期間保護陣列。

我正在主線程上進行協調,但我不確定這足以保護衝突,特別是當用戶在查詢待處理時敲擊某個條目時;他正在查看的詳細信息可能會被吹走。

有一個類似的問題,以你(和我)在這裏: Update UITableView using threads

但答案痛斥的時間太長,他的後臺操作,代替回答他的問題的海報。

我打算使用NSLock,並在修改數組和所有UITableView委託方法之前獲取它,除非有人有更好的主意。

3

不知道更多關於您的應用程序的信息,我認爲更好的解決方案之一是將數組保留在主線程上,並在其他線程需要進行更改時將其分派給它。像這樣:

dispatch_async(dispatch_get_main_queue(), ^{ 
       [array addObject:object]; 
       [tableView reloadData]; 
      }); 

當然,你可以使用dispatch API獲得更復雜的結果,但它確實爲你處理鎖定和一切。絕對比使用NSLock更優雅。它只適用於iOS 4或更高版本。

+2

從幾個月後的經驗來看,這幾乎總是正確的想法。在後臺線程中執行CPU密集型解析和處理,但是當需要更新數組時,請在主線程上執行。 – 2011-04-19 15:56:05