MagicalRecord MR_saveToPersistentStoreWithCompletion 极慢

Posted

技术标签:

【中文标题】MagicalRecord MR_saveToPersistentStoreWithCompletion 极慢【英文标题】:MagicalRecord MR_saveToPersistentStoreWithCompletion extremely slow 【发布时间】:2013-11-01 20:54:37 【问题描述】:

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

self.controllerContext = [NSManagedObjectContext MR_context];

然后,当用户编辑或输入数据时,我会在 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];
        
    ];

这也很好用,但在 iPhone4 上保存 2-10 个实体大约需要 5-10 秒,在 iPhone5 上需要 3-5 秒。对于如此少量的已保存数据,这似乎很长。 我最近更新到 MagicalRecord 2.2 Release。

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

【问题讨论】:

不要保存在 mainThread 上下文中 但是当用户输入数据时,新的实体被插入到上下文中。由于这些动作发生在 ui 中,因此对象被插入到 localContext 中。问题不在于阻塞 ui,而在于保存操作的性能。 如果需要 5-10 秒,应该很容易发现 Instruments 中的延迟并从那里开始。您发布的代码中没有任何内容会导致延迟。 我只是在模拟器上对其进行了分析。其他保存大约需要 300 毫秒,上述代码的保存大约需要 1500 毫秒。但那是在模拟器上,在设备上,需要更长的时间。但我只能用持续时间来保存保存,没有更多信息可以帮助我调试这个问题 【参考方案1】:

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

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

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

【讨论】:

我试过了,但保存对象时我的 FetchedResultsController 没有更新。

以上是关于MagicalRecord MR_saveToPersistentStoreWithCompletion 极慢的主要内容,如果未能解决你的问题,请参考以下文章

MagicalRecord:后台保存

未找到 MagicalRecord/MagicalRecordDeprecationMacros.h 文件

WatchKit 和 MagicalRecord - 这可能吗?

MagicalRecord 3.0 设置

MagicalRecord 日期解析

Simperium和MagicalRecord