Tim*_*Tim 9 xcode core-data object ios
我是众多获得以下Core Data错误的人之一(133000):
Object's persistent store is not reachable from this NSManagedObjectContext's coordinator
Run Code Online (Sandbox Code Playgroud)
正如我所看到的那样,这是因为Core Data的线程限制.
但是,我已经遵守了所有正确的线程限制,但这个错误仍然存在.
我使用下面的代码创建一个NSManagedObject来执行主线程上的函数:
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self
selector:@selector(commitPlayer:)
object:message];
[[NSOperationQueue mainQueue] addOperation:operation];
[operation release];
Run Code Online (Sandbox Code Playgroud)
这个函数然后创建对象,它非常高兴.
然后尝试获取[objectContext existingObjectWithID:objectID error:&error]具有上述错误的返回nil 的对象.
我还使用@synchonized互斥锁块来包装对象,以防万一,但它仍然无法获取该对象.
似乎保存上下文之前手动修复了这个问题,但是我想要获取对象,无论是否保存它,因为此时不应该保存数据库.
Tim*_*Tim 13
找到了答案.
这个问题与线程无关.这只是因为已经发生了写作(因此人们为什么通过Occam的Razor认为这是一个线程问题).
这个错误显示的真正原因与线程无关,就像互联网所说的那样,但是因为在你尝试另一次读/写的同时读/写已经在进行中.
[objectContext existingObjectWithID:objectID error:&error]在数据库上执行I/O以确保您获得的对象确实存在.但是,在我的情况下,我已经在堆栈中执行更高的读取.
它试图阅读父母的孩子,然后尝试阅读每个孩子.实际上,我应该使用它[objectContext objectWithID:objectID]来获取故障对象,然后在需要时执行适当的I/O.
这不仅是正确的做事方式,还可以通过在您只需要它们的列表时不加载500亿个子实体来节省内存.
希望有助于为某人澄清事情!
我想分享我的案例,这与NSManagedObjectContextDidSaveNotification有关:
我只在我的UnitTests目标中遇到此问题,在涉及与Core Data堆栈交互的测试用例中.
在我的单元测试配置目标中,每个这样的情况都在前面是beforeEach具有cleanUnitTestsDatabase()宏的块,它执行Core Data的.sqlite3文件的删除,并将托管对象上下文和持久性存储协调器重新解释为新的状态,所以我有一个完整的数据库.每次我在新的/下一个测试用例中运行时清理状态.
这导致了这个问题,因为有时在当前数据库被砍掉之后调用了以下方法,因为当前的测试用例已经通过并且已经输入了下一个测试用例:
- (void)managedObjectContextDidSaveNotification:(NSNotification *)notification {
NSManagedObjectContext *savedContext = [notification object];
if ([savedContext isEqual:self.mainQueueManagedObjectContext] == NO) {
dispatch_async(dispatch_get_main_queue(), ^{
[self.mainQueueManagedObjectContext mergeChangesFromContextDidSaveNotification:notification];
});
}
}
Run Code Online (Sandbox Code Playgroud)