我正在構建一個使用web-sockets和核心數據的聊天應用程序。NSFetchedResultsController插入鎖定UI
基本上,只要在網絡插座上接收到消息時,會發生以下情況:
- 檢查,如果通過執行核心數據存在的消息取指令使用id(索引)
- 如果1 。返回yes,更新消息並執行核心數據保存。如果1.返回否,則創建消息並執行核心數據保存。
- 更新表視圖,通過更新或插入新行。
這裏是我的設置:
我有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爲這種操作進行了超級優化。
任何明顯的新手錯誤我可能會提交?
在日誌中顯示的時間差顯示更少的行兩次更新之間的差異,而不是一次更新的持續時間。 – Mundi
@Mundi是它顯示每個週期有多慢。 – scrrr