MagicalRecord MR_saveToPersistentStoreWithCompletion非常慢

时间:2013-11-01 20:54:37

标签: ios core-data magicalrecord

我有一个模态视图控制器,用户可以在其中输入或编辑数据。有一个保存和取消按钮。 因此,我为此viewController创建了一个新的NSManagedObjectContext并将其存储在属性中。

self.controllerContext = [NSManagedObjectContext MR_context];

然后,当用户编辑或输入数据时,我会将这些entites的entites和值创建到controllerContext中。

当用户点击取消按钮时,我会执行以下操作:

- (void)cancelButtonClicked {
    [self.controllerContext rollback];
    [self.controllerContext MR_saveToPersistentStoreWithCompletion:^(BOOL success, NSError *error) {
        if (success || error == nil) {
            [self dismissViewControllerAnimated:YES completion:nil];
        } else {
            if (error) {
                [ErrorUtil logError:error fromAction:@"TagebuchDetailView Cancel"];
            }
            [SVProgressHUD showErrorWithStatus:error.localizedDescription];
            [self dismissViewControllerAnimated:YES completion:nil];
        }
    }];
}

这非常好用,没有保存任何值。当用户点击保存按钮时,我会执行以下操作:

- (void)saveButtonClicked {
     //Last modified setzen
    self.selectedEintrag.lastModified = [NSDate date];
    self.selectedEintrag.isDirty = [NSNumber numberWithBool:YES];

    //Save Context and dismiss
    self.subTitleView.navigationBarSubtitle = NSLocalizedString(@"view.subtitle.saving", nil);
    [self.controllerContext MR_saveToPersistentStoreWithCompletion:^(BOOL success, NSError *error) {
        if (success || error == nil) {
            [self dismissViewControllerAnimated:YES completion:nil];
            self.subTitleView.navigationBarTitle = nil;
        } else {
            if (error) {
                [ErrorUtil logError:error fromAction:@"TagebuchDetailView Save"];
            }
            [SVProgressHUD showErrorWithStatus:error.localizedDescription];
            [self dismissViewControllerAnimated:YES completion:nil];
        }
    }];
}

这也很好,但是iPhone2上的2-10个节目需要大约5-10秒,而iPhone5则需要3-5个。对于如此少量的保存数据,这似乎相当长。 我最近更新到MagicalRecord 2.2 Release。

任何想法可能是什么以及如何提高保存性能?也许是2.2中的错误?我使用以前版本的Magicalrecord,最近节省的性能变坏了。我不确定它最近是否会在iOS7上更新或测试。

1 个答案:

答案 0 :(得分:0)

所以我自己发现了这个。问题是,controllerContext是默认上下文的子上下文。在另一个视图中,我有一个fetchedresultcontroller侦听默认上下文。保存控制器上下文时,它们似乎相互阻塞。 我的修复是,将控制器父上下文设置为根保存上下文。

self.controllerContext = [NSManagedObjectContext MR_contextWithParent:[NSManagedObjectContext MR_rootSavingContext]];

然后,一切都像魅力一样。