我對經常必須處理100K插入,刪除和更新與核心數據的應用工作。如果它在5K刀片上窒息,那麼需要做一些優化。
首先,創建一些NSOperation子類來處理數據。覆蓋它的-main方法來執行處理。但是,此方法不能保證在主線程上運行。事實上,它的目的是爲了避免在主線程上執行代價昂貴的代碼,從而導致嚴重凍結,從而影響用戶體驗。因此,在-main方法中,您需要創建另一個託管對象上下文,它是您的主線程託管對象上下文的子項。
- (void)main
{
NSManagedObjectContext *ctx = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[ctx setPersistentStoreCoordinator:mainManagedObjectContext.persistentStoreCoordinator];
[ctx setUndoManager:nil];
// Do your insertions here!
NSError *error = nil;
[ctx save:&error];
}
根據你的情況,我不認爲你需要一個撤銷管理器。由於核心數據正在跟蹤您的更改,因此將會導致性能損失。
使用THIS上下文在-main方法中執行所有CRUD操作,然後保存該託管對象上下文。無論您的主線程的託管對象上下文擁有什麼,都必須註冊以響應名爲NSManagedObjectContextDidSaveNotification的NSNotification。註冊像這樣:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mocDidSaveNotification:) name:NSManagedObjectContextDidSaveNotification object:nil];
然後定義選擇:
- (void)mocDidSaveNotification:(NSNotification *)notification
{
NSManagedObjectContext *ctx = [notification object];
if (ctx == mainManagedObjectContext) return;
[mainManagedObjectContext mergeChangesFromContextDidSaveNotification:notification];
}
當這一切走到一起,它可以讓你執行在後臺線程長時間操作而不會阻塞UI線程。這種體系結構有幾種不同的形式,但其核心主題是:在BG線程上處理,在主線程上合併,更新UI。還有一些需要注意的事項:(1)在處理過程中保持一個自動釋放池,並且每隔一段時間耗盡一次以減少內存消耗。在我們的例子中,我們每1000個對象就做一次。根據您的需要進行調整,但請記住,根據每個對象所需的內存量,耗盡可能會很昂貴,因此您不想經常這樣做。 (2)儘量減少你的數據到絕對的最低限度,你需要有一個功能的應用程序。通過減少要解析的數據量,可以減少保存所需的時間。 (3)通過使用這種多線程方法,您可以同時處理您的數據。因此,創建3-4個NSOperation子類的實例,每個實例只處理一部分數據,以便它們全部同時運行,從而導致分析數據集所需的實時時間更少。
這個問題是怎麼發生的?我正在處理類似大小的數據集(如果不大),並且需要每天從Web服務中將其拉下一次。我正在考慮下載夜間準備的.sqlite文件與實際的Web服務。 – Augie 2012-07-10 20:51:47
我認爲加載準備好的sqlite文件是這種情況下最好的解決方案,或者至少是最簡單的一種。無論如何,其他解決方案太複雜,手機設備性能差。 – Matthes 2012-07-11 09:48:47