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/MagicalRecordDeprecationMacros.h 文件