gpt4 book ai didi

iphone - 删除/删除核心数据中的记录非常非常慢

转载 作者:行者123 更新时间:2023-12-03 21:04:31 24 4
gpt4 key购买 nike

我正在对应用程序进行最后的修饰,但在批量删除记录时遇到困难。按一下按钮,一组大约。需要将3500条记录添加到数据库中。这不是问题,大约需要花费时间。 3-4 秒。

但有时(不经常,但需要有该选项)所有这些记录都需要删除。我刚刚做了这个操作,花了20分钟。这里可能出了什么问题?只有一个依赖项,所有记录都是特定集合的子项。

我将所有项目添加到集合中,将它们从集合中删除,然后逐一删除。每 5% 我都会更新对话,当一切完成后我会提交更改。但删除这些项目只需要很长时间(因为我可以看到进度对话进展非常缓慢)

- (void) deleteList:(DOCollection *) collection {

// For the progress dialogue
NSMutableDictionary* dict = [NSMutableDictionary dictionaryWithObject:@"Clearing vocabulary list!" forKey:@"message"];
float totalItems = [collection.items count];
float progress = 0;
float nextProgressRefresh = 0.05;

NSMutableSet* itemsSet = [NSMutableSet set];
for (DOItem* item in collection.items) {
[itemsSet addObject:(NSNumber*)[NSNumber numberWithInt:[item.itemId intValue]]];
}

// Remove all of them from the collection
[managedObjectContext performBlockAndWait:^{
[collection setItems:[NSSet set]];
}];

for (NSNumber* itemId in itemsSet) {
DOItem* item = [itemController findItem:[itemId intValue]];
if (item != nil) {
[[self itemController] removeItem:item];
}

progress++;
if((nextProgressRefresh < (progress / totalItems))){
NSString* sProgress = [NSString stringWithFormat:@"%f", (progress / totalItems) * 0.85];
//[dict setValue:@"Saving the database...!" forKey:@"message"];
[dict setValue:sProgress forKey:@"progress"];
[[NSNotificationCenter defaultCenter] postNotificationName:kUpdatePleaseWaitDialogue object:dict];
nextProgressRefresh = nextProgressRefresh + 0.05;
}
}

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[managedObjectContext performBlockAndWait:^{
[[self collectionController] commitChanges];
}];
[[NSNotificationCenter defaultCenter] postNotificationName:kSavingDataComplete object:nil];
});

//NSLog(@"Wait 2!");
[NSThread sleepForTimeInterval:1];

}

在 DOItemController 中:

- (void) removeItem: (NSManagedObject*) item {
[[self managedObjectContext] deleteObject:item];
}

最佳答案

不确定您如何构建数据模型。但我会将其设置为级联删除您的对象。如果 DOItem 对象对于 DOCollection 来说是唯一的,那么您可以将删除规则设置为级联。这将自动删除关联的 DOItem 并将其从 DOCollection 项集对象中删除。

要从 DOCollection 中删除 DOItem 对象,请检查 DOCollection.h 文件,您应该有一个类似于

的方法
-(void)removeDOItemObjects:(NSSet *)value

如果没有,它们仍可能由 Core Data 为您动态生成。在您的头文件中,您应该包含以下内容:

@property(nonatomic,retain) DOItem *items

然后在您的实现文件中,您应该包含以下内容:

@synthesize items

应自动为这些生成适当的方法:

-(void)addItemsObject:(DOItem*)value
-(void)addItems:(NSSet *)values
-(void)removeItemsObject:(DOItem *)value
-(void)removeItems:(DOItem *)values
-(NSSet *)items

请参阅“自定义对多关系访问器方法”here for more info .

此方法是在您创建数据模型和关联的实现文件时为您提供的,并且应由 Core Data 进行高度优化。然后,您只需执行以下操作即可删除对象:

- (void) deleteList:(DOCollection *) collection {

// Remove all of them from the collection
[managedObjectContext performBlockAndWait:^{
// Updated 01/10/2012
[collection removeItems:collection.items];
NSError *error = nil;
if (![managedObjectContext save:&error]) {
NSLog(@"Core Data: Error saving context."); }
};
}];

}

您可能想要使用此方法检查删除的性能并继续向用户提供反馈。如果性能是一个问题,请考虑跨步,将设置分为多个 block ,并在每个跨步之前执行上述方法,更新用户界面等。

同样,我不确定您的应用程序架构,但乍一看,这看起来像是问题所在。

祝你好运!

关于iphone - 删除/删除核心数据中的记录非常非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8772627/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com