0

我正在構建一個使用web-sockets和核心數據的聊天應用程序。NSFetchedResultsController插入鎖定UI

基本上,只要在網絡插座上接收到消息時,會發生以下情況:

  1. 檢查,如果通過執行核心數據存在的消息取指令使用id(索引)
  2. 如果1 。返回yes,更新消息並執行核心數據保存。如果1.返回否,則創建消息並執行核心數據保存。
  3. 更新表視圖,通過更新或插入新行。

這裏是我的設置:

我有2個默認的託管對象的上下文。 MAIN(NSMainQueueConcurrencyType)和WRITER(NSPrivateQueueConcurrencyType)。 WRITER引用了persisten商店協調員,MAIN沒有,但WRITER被設置爲MAIN的父代。

TableView連接到連接到MAIN的NSResultsFetchController。

提取全部使用以MAIN作爲其父項的臨時上下文(「performBlock:」)執行。寫入如下所示:保存臨時上下文,然後保存MAIN,然後保存WRITER。

問題:

因爲更新通過網絡插座進來,在一個繁忙的聊天室,許多更新發生在很短的時間。同步以提取較舊的消息可能意味着很多消息快速進入。這會鎖定用戶界面。

我用牽強,結果控制器的委託這樣的跟蹤更改UI:

// called on main thread 
- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller 
{ 
    NSLog(@"WILL CHANGE CONTENT"); 
    [_tableView beginUpdates]; 
} 

// called on main thread 
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller 
{ 
    NSLog(@"DID CHANGE CONTENT"); 
    [_tableView endUpdates]; 
} 

和這裏的什麼,我在日誌文件中看到一個例子:

2014-07-14 18:46:20.630 AppName[4938:60b] DID CHANGE CONTENT 
2014-07-14 18:46:22.334 AppName[4938:60b] WILL CHANGE CONTENT 

這每插入將近2秒!

難道這僅僅是我在桌面上打的一個限制嗎? (在某些情況下我說的是1000+行)但我無法想象是這種情況。 UITableViews爲這種操作進行了超級優化。

任何明顯的新手錯誤我可能會提交?

+0

在日誌中顯示的時間差顯示更少的行兩次更新之間的差異,而不是一次更新的持續時間。 – Mundi

+0

@Mundi是它顯示每個週期有多慢。 – scrrr

回答

0

好吧我想通了。

問題是tableView:heightForRowAtIndexPath:。計算行高度的提取需要花費時間,每次執行tableView。endUpdates被調用,UITableView需要所有行的高度。

tableView:estimatedHeightForRowAtIndexPath:是可能的路要走(iOS7 +),否則我可能會選擇緩存的高度自己(因爲行不改變),或者只是altog

0

這是不符合邏輯:

寫這個樣子:保存臨時的上下文,然後保存MAIN,然後保存作家。

如果作家所做的更改不會一直持續到下一個保存主要的子環境。

+0

諾諾,作家是主要的父母。 – scrrr