【发布时间】: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 毫秒。但那是在模拟器上,在设备上,需要更长的时间。但我只能用持续时间来保存保存,没有更多信息可以帮助我调试这个问题
标签: ios core-data magicalrecord