編輯:剛看了2015年的WWDC「什麼核心數據的新」(它總是第一個視頻我看,但今年我已經很繁忙),他們宣佈了一個新的API:NSBatchDeleteRequest
應該比以前的解決方案效率更高。
高效有多重意義,並且通常意味着某種權衡。在這裏,我假設你只是想在刪除時包含內存。
核心數據有很多的性能選項,超出了任何單個SO問題的範圍。
如何管理內存取決於您的managedObjectContext和fetchRequest的設置。查看文檔以查看所有選項。不過,特別是,你應該記住這些事情。
另外,請記住性能方面。這種類型的操作應該在單獨的線程上執行。
另外,請注意你的對象圖的其餘部分也將開始發揮作用(因爲CoreData如何處理相關對象的缺失。
關於內存的消耗,也有對特別要注意MOC兩個屬性。雖然這裏有很多,但它並不接近全面。如果你想真正看到發生了什麼,在每次保存操作之前和之後NSLog記錄你的MOC。特別是,log registeredObjects和deletedObjects。
MOC有一個註冊對象的列表。默認情況下,它不保留已註冊的對象。但是,如果retaininsRegisteredObjects爲YES,它將保留所有註冊的對象。
對於特別的刪除,setPropagatesDeletesAtEndOfEvent告訴MOC如何處理相關的對象。如果您希望用保存處理它們,則需要將該值設置爲NO。否則,它將等待,直到當前事件完成
如果您有非常大的對象集,請考慮使用fetchLimit。雖然缺點並不需要很多記憶,但它們仍然需要一些,而且每次數千個並不重要。這意味着更多的提取,但你會限制內存的數量
還要考慮,任何時候你有大的內部循環,你應該使用自己的自動釋放池。
如果此MOC具有父級,則只會將這些更改移至父級。在這種情況下,如果你有一個母公司的MOC,你只是讓這個成長。
限制內存,考慮這個(不一定是最適合你的情況 - 有很多核心數據選項 - 只有你自己知道什麼是最適合你的情況,根據你提供的選項在其他地方使用
我在NSManagedObjectContext上編寫了一個類別,當我想要確保保存到後備存儲區時,我用它來保存,與此非常相似如果不使用MOC層次結構,需要它,但是......真的沒有理由不使用層次結構(除非你被綁定到老的iOS)
- (BOOL)cascadeSave:(NSError**)error {
__block BOOL saveResult = YES;
if ([self hasChanges]) {
saveResult = [self save:error];
}
if (saveResult && self.parentContext) {
[self.parentContext performBlockAndWait:^{
saveResult = [self.parentContext cascadeSave:error];
}];
}
return saveResult;
}
我修改你的代碼一點點......
+ (void)deleteRelatedEntitiesInManagedObjectContext:(NSManagedObjectContext *)context
{
NSFetchRequest *fetch = [[NSFetchRequest alloc] init];
[context setUndoManager:nil];
[fetch setEntity:[NSEntityDescription entityForName:NSStringFromClass(self) inManagedObjectContext:context]];
[fetch setIncludesPropertyValues:NO];
[fetch setFetchLimit:500];
NSError *error = nil;
NSArray *entities = [context executeFetchRequest:fetch error:&error];
while ([entities count] > 0) {
@autoreleasepool {
for (NSManagedObject *item in entities) {
[context deleteObject:item];
}
if (![context cascadeSave:&error]) {
// Handle error appropriately
}
}
entities = [context executeFetchRequest:fetch error:&error];
}
}
優化工作:1.刪除-setIncludesPropertyValues行; 2.將獲取限制從500更改爲2500(真的!); 3。使用@autoreleasepool –