【发布时间】:2012-11-30 13:58:58
【问题描述】:
我的问题是这样的。我想异步保存到磁盘。设置核心数据堆栈的代码如下所示。
- (NSManagedObjectContext *)managedObjectContext {
NSPersistentStoreCoordinator *coordinator = self.persistentStoreCoordinator;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSManagedObjectContext *privateMOC = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[privateMOC setPersistentStoreCoordinator:coordinator];
__managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[__managedObjectContext setParentContext:privateMOC];
});
return __managedObjectContext;
}
当我执行这样的获取时:
NSMutableArray *result = [NSMutableArray array];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:[DataObject entityName]
inManagedObjectContext:self.managedObjectContext];
[request setEntity:entity];
[request setPredicate:[NSPredicate predicateWithFormat:@"SUBQUERY(threadEntities, $emp, $emp.thread = %@).@count>0 AND tags.@count!=0", self, nil ]];
[request setPropertiesToFetch:@[@"creationDate", @"data"]];
[request setSortDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:YES]]];
NSError *error = nil;
[result addObjectsFromArray:[self.managedObjectContext executeFetchRequest:request error:&error]];
它会因为这个错误而崩溃:
Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 375961053 beyond bounds [0 .. 7]'
另一方面,这样的堆栈设置效果很好:
- (NSManagedObjectContext *)managedObjectContext {
NSPersistentStoreCoordinator *coordinator = self.persistentStoreCoordinator;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
__managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[__managedObjectContext setPersistentStoreCoordinator:coordinator];
});
return __managedObjectContext;
}
Database 内部有一个 DataObject 和一些用于管理它的附加对象。问题是,为什么这个 fetch 会受到影响,而应用程序之前使用相同参数执行的计数两次都有效?
【问题讨论】:
-
让我有点恼火的是
privateMOC在__managedObjectContext创建后超出了范围。我不知道 MOC 是否强烈引用它的父上下文。如果没有,那么私有上下文可能会被释放,然后会发生奇怪的事情。 - 您可以尝试在实例变量中保留对privateMOC的强引用,看看是否有帮助。
标签: objective-c ios core-data concurrency