多个NSManagedObjectContext或传递它?

时间:2014-04-01 15:18:30

标签: ios iphone objective-c ipad core-data

所以我已经陷入这种情况,由于某种原因,我有数据保存但在我终止应用程序之前它并没有完全保存。细节并不重要,但在查看我的代码时,我发现了以下内容:

在我的应用程序委托中,我实例化

  • 的NSManagedObjectContext
  • NSManagedObjectModel
  • NSPersistentStoreCoordinator

我有一个后台线程,可以完成大量的数据处理和保存 - 在这个线程中,我使用这个init调用创建了第二个managedObjectContext:

- (void)initCoreDataWithNSPersistentStoreCoordinator:(NSPersistentStoreCoordinator *)storeCoordinator andLocationManager:(CLLocationManager *)manager {
    if (!managedObjectContext) {

        if (storeCoordinator != nil) {
            managedObjectContext = [[NSManagedObjectContext alloc] init];
            [managedObjectContext setPersistentStoreCoordinator:storeCoordinator];
        }

    } else {
        NSLog(@"Dual Init attempted!!");
    }

    if (manager != nil) {
        [self setLocationManager:manager];
    }

    /* Setup a Notification Handler now that COREData is initialized */
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(saveContext:)
                                                 name:@"saveContext"
                                               object:nil];
}

我的代码中的其他任何地方(我没有看到保存问题)我实际上使用与此类似的prepareForSegue方法传递原始上下文:

// Pass on managedObjectContext
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

    // If the destination VC is able to take teh setManagedObjectContext method the current objectContext will be passed along.
    if ([segue.destinationViewController respondsToSelector:@selector(setManagedObjectContext:)]) {
        [segue.destinationViewController performSelector:@selector(setManagedObjectContext:)
                                              withObject:_managedObjectContext];
    } else {

        NSLog(@"Segue to controller [%@] that does not support passing managedObjectContext", [segue destinationViewController]);
    }
}

其中一种方法是"更好"比另一个?我猜测双重上下文是我公正的数据刷新的原因,但我并不确定。但真正的问题是这些方法之一"首选"通过苹果,如果是这样的话。此外,在任何一种情况下,我需要注意哪些陷阱。

谢谢!

1 个答案:

答案 0 :(得分:2)

在视图控制器之间传递主要托管对象上下文是正确的做法,因为它们都在主线程上运行。

此问题可能与您的后台线程管理对象上下文有关。你应该有一个不同的上下文,因为重要的是对正确的线程(队列)进行上下文的所有更新,但是如果你有多个后台线程,那么你当前的代码将使它们共享上下文,你会看到的问题。

查看为每个后台线程创建不同的上下文。