我剛開始學習核心數據編程。我試圖做一個例子,其中有一個顯示人員列表(屬性:名字,姓氏)的表視圖。表視圖依賴於NSFetchResultController來顯示人員列表。核心數據多線程和嵌套上下文
我跟着嵌套上下文圖案如下:
根上下文(NSPrivateQueueConcurrencyType)< --->主上下文(NSMainQueueConcurrencyType)< --->兒童上下文(NSPrivateQueueConcurrencyType)。
子上下文用於執行巨大的插入/獲取(使用perormBlock:方法)。 當我嘗試執行一個巨大的插入(約5000行)時,保存子上下文,然後保存主上下文,然後根上下文,我看到我的用戶界面被阻止,直到保存完成。
任何人都可以告訴我爲了創建高性能應用程序,採用何種最佳解決方案?任何人都可以請我提供一個很好的簡單代碼,展示如何在不阻止用戶界面的情況下在後臺進行巨大的讀取/插入操作?
[_indicator startAnimating];
NSManagedObjectContext *aContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
aContext.parentContext = [[SDCoreDataController sharedInstance] mainManagedObjectContext];
[aContext performBlock:^{
NSError *error;
for (int i = 0; i < 5000; i++)
{
FootBallCoach *backgroundCoach = [NSEntityDescription insertNewObjectForEntityForName:@"FootBallCoach" inManagedObjectContext:aContext];
backgroundCoach.firstName = [NSString stringWithFormat:@"José %i",i];
backgroundCoach.lastName = [NSString stringWithFormat:@"Morinho %i",i];
backgroundCoach.cin = [NSString stringWithFormat:@"%i",i];
if (i % 50 == 0)
{
[aContext save:&error];
[aContext reset];
}
}
[[SDCoreDataController sharedInstance] saveMainContext];
[[SDCoreDataController sharedInstance] saveRootContext];
dispatch_async(dispatch_get_main_queue(), ^{
[_indicator stopAnimating];
[self refreshCoaches:nil];
});
}];
https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/Concurrency.html –