當用戶下載我的應用程序並'註冊'時,我們用核心數據填充用戶數據,這可能會潛在成千上萬的對象。優化批量刪除和創建NSManagedObjects
我們還爲用戶提供「註銷」選項,在此時我們批量刪除這些對象。 (我們不會刪除底層的sqlite商店,因爲那裏的一些數據不是用戶特定的,我們希望保留這些)。
在批量創建和刪除中常見的是這些過程花費了大量時間。
進行明顯的優化和使用時間輪廓儀後,我到達的最大瓶頸似乎是這種模式的結論:
- (void)awakeFromFetch {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(someSelector:) name:someNotification object:nil];
}
- (void)didTurnIntoFault {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
這似乎是服用65-70%的所有的CPU時間在創建和刪除過程中。我試圖儘量減少在創建時受到傷害的對象的數量,但是有一個我不能進一步降低的最小數量。
但是對於刪除,看起來標記爲被刪除的對象必須被獲取,無故障並且再次發生故障,因此didTurnIntoFault
被調用以用於所有被刪除的對象。我在didTurnIntoFault
中執行了大部分對象清理,但令人驚訝的是,從默認的NSNotificationCenter中以觀察者身份移除對象似乎是最重的操作(大幅度)。
任何想法爲什麼removeObserver:變得如此沉重?有關如何優化此更快註冊/註銷的想法?
爲什麼不在用戶註銷時創建新的存儲。使用種子數據保存新商店,並在用戶註銷時替換商店,而不是刪除對象。或者使用兩個存儲區,一個存儲可丟棄的用戶數據,另一個存儲您想要保留的數據,然後用空白的用戶數據替換。 –
爲什麼你甚至需要數千個物體?保持多個商店和延遲加載。 – Wain
我不確定多個商店如何在創建和刪除期間幫助我需要插入/刪除所有對象。 –