1

我已经复制了所有本地联系人并将它们存储在核心数据中,现在当我使用时间分析器工具时,它显示我花费了大量时间从我的应用程序中删除本地联系人。任何人都可以建议我任何优化技术来改进我的代码和应用程​​序性能。

这是我从核心数据中删除联系人的代码:

+(void)deleteContacts
{
    [[LoadingIndicator currentIndicator]displayActivity:@"Deleting Old contacts"];

    //fetch the data from core data and delete them because you are going to sync again
    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication]delegate];
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    // Edit the entity name as appropriate.
    NSManagedObjectContext *managedObjectContext=[appDelegate managedObjectContext];

    fetchRequest.entity = [NSEntityDescription entityForName:@"PersonEvent" inManagedObjectContext:managedObjectContext];

    NSInteger *contactsIdentifier=1;
    fetchRequest.predicate = [NSPredicate predicateWithFormat:@"sourceflag == %d", contactsIdentifier];


    NSArray * persons = [managedObjectContext executeFetchRequest:fetchRequest error:nil];



    //error handling goes here
    if (persons.count>0) {


        for (NSManagedObject * person in persons) {
            [managedObjectContext deleteObject:person];

        }
    }
    NSError *saveError = nil;
    [managedObjectContext save:&saveError];
    [[LoadingIndicator currentIndicator]displayCompleted:@"Done"];
    [[LoadingIndicator currentIndicator]hide];
    NSLog(@"Finished deleting local contacts..");
}

时间分析器显示 94.3% 的时间花在 [managedObjectContext save:&saveError];

任何帮助,将不胜感激

谢谢

4

2 回答 2

0

首先我想说“好问题”。并欣赏您担心的事情。

回答 :-

在核心数据中 managedObjectContext 仍然具有同一对象中的所有更改,它不会将其更新到实际数据库。

因此,当[managedObjectContext save:&saveError]被调用时,它开始将其更新到核心数据数据库。因此,您可以按照以下方式进行优化并检查时间配置文件的性能。

NSError *saveError = nil;
if (persons.count>0) {


    for (NSManagedObject * person in persons) {
        [managedObjectContext deleteObject:person];
        [managedObjectContext save:&saveError];
    }
}
[[LoadingIndicator currentIndicator]displayCompleted:@"Done"];
[[LoadingIndicator currentIndicator]hide];
NSLog(@"Finished deleting local contacts..");

希望对你有帮助……!

于 2013-07-04T13:33:17.637 回答
0

也许PersonEvent实体具有配置有Cascade删除规则的关系?甚至这些关系另一端的对象也可能有类似的删除规则?Core Data 将单独触发所有这些故障。

在这种情况下,您应该在获取要删除的对象时预取这些关系:

fetchRequest.relationshipKeyPathsForPrefetching
    = @[@"relationshipName",
        @"anotherRelationship",
        @"anotherRelationship.subrelationship"];

如果没有和 一起级联删除对象PersonEvent,而你只是删除了很多PersonEvent,你可以尝试批量保存。这可能不会减少保存所有删除所需的总时间,但它不会锁定上下文、持久存储协调器和存储文件本身以进行一次巨大的保存。

const NSUInteger kBatchSize = 200;
NSUInteger currentCount = 0;
for (NSManagedObject *person in persons) {
    currentCount++;
    [context deleteObject:person];
    if (currentCount == kBatchSize) {
        currentCount = 0;
        NSError *error;
        BOOL saved = [context save:&error];
    }
}

if (currentCount != 0) {
    NSError *error;
    BOOL saved = [context save:&error];
}
于 2013-07-08T20:01:43.140 回答