ios - 多个 NSManagedObjectContext 或传递它?

标签 ios iphone objective-c ipad core-data

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

在我的 App Delegate 中实例化

  • 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]);
    }
}

一种方法是否比另一种“更好”?我猜双重上下文是我公正数据刷新的原因,但我不太确定。但真正的问题是苹果“首选”这些方法之一,如果是的话。此外,在这两种情况下我需要注意哪些陷阱。

谢谢!

最佳答案

在 View Controller 之间传递主托管对象上下文是正确的做法,因为它们都在主线程上运行。

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

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

关于ios - 多个 NSManagedObjectContext 或传递它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22790047/

相关文章:

doxygen Markdown 页面中的 Objective-C 语法

ios - 在 tableview 中使用 parse.com 图片时出错

iphone - 如何知道 AVPlayer 何时使用纯音频比特率?

iphone - 使用 Sharekit 与 facebook 共享时出现应用程序响应错误

ios - objective-c : Passing variables between controllers

ios - Game Center 排行榜显示一个结果

ios - seekToTime 不适用于 iOS 9 中的实时 Assets

iPhone背景音乐播放器

ios - 使用 TesseractOCRiOS 时出错

iphone - 保持同一应用程序的 android 和 iphone 版本的最佳策略是什么