在一个玩具 iOS 项目中,我使用 MagicalRecord 在应用程序委托中设置 CoreData 堆栈。使用以下代码:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[MagicalRecord setupCoreDataStackWithStoreNamed:@"ToyProject.sqlite"];
[[NSManagedObjectContext MR_defaultContext] setUndoManager:[[NSUndoManager alloc] init]];
...
}
我有一个正在编写的 NSManagedObject 的子类(NSRailsManagedObject——我分叉了 NSRails 并添加了 CoreData 支持),并且我给了它一个 saveContext 方法:
- (void)saveContext {
dispatch_async(dispatch_get_main_queue(), ^{
@try {
NSError *error = nil;
if (![self.managedObjectContext save:&error]) {
NSLog(@"Failed to save core data: %@", [error localizedDescription]);
} else {
NSLog(@"\"Successfully\" saved your data.");
}
}
@catch (NSException *exception) {
NSLog(@"Couldn't save your data! Try again later :(");
}
@finally {
NSLog(@"Look, I don't know what else to tell you, mang.");
}
});
}
当我尝试使用此方法保存此类的子类时,我没有收到任何错误,并且保存表面上是成功的。但是,在应用程序的下一次运行中,前一次运行中存在的任何数据都不存在。如果 saveContext 方法包含以下代码,则它可以正常工作:
- (void)saveContext {
[[NSManagedObjectContext MR_defaultContext] MR_save];
}
此外,如果我将两者混合,保存不会持久化数据。
- (void)saveContext {
dispatch_async(dispatch_get_main_queue(), ^{
@try {
NSError *error = nil;
if (![[NSManagedObjectContext MR_defaultContext] save:&error]) {
NSLog(@"Failed to save core data: %@", [error localizedDescription]);
} else {
NSLog(@"\"Successfully\" saved your data.");
}
}
@catch (NSException *exception) {
NSLog(@"Couldn't save your data! Try again later :(");
}
@finally {
NSLog(@"Look, I don't know what else to tell you, mang.");
}
});
}
我真的不知道还能尝试什么。谁能指出我正确的方向?