【问题标题】:saving NSManagedObjectContext causes the app to wait infinitely保存 NSManagedObjectContext 会导致应用程序无限等待
【发布时间】:2011-07-27 23:59:19
【问题描述】:

为什么每次我在我的 NSManagedObjectContext 上调用save

-(NSManagedObjectContext*)managedObjectContext {
    NSMutableDictionary* threadDictionary = [[NSThread currentThread] threadDictionary];
    NSManagedObjectContext* backgroundThreadContext = [threadDictionary objectForKey:RKManagedObjectStoreThreadDictionaryContextKey];
    if (!backgroundThreadContext) {
        backgroundThreadContext = [self newManagedObjectContext];
        [threadDictionary setObject:backgroundThreadContext forKey:RKManagedObjectStoreThreadDictionaryContextKey];
        [backgroundThreadContext release];

        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(mergeChanges:)
                                                     name:NSManagedObjectContextDidSaveNotification
                                                   object:backgroundThreadContext];
    }
    return backgroundThreadContext;
}

- (NSError*)save {
    NSManagedObjectContext* moc = [self managedObjectContext];
    NSError *error = nil;

    @try {
        if (![moc save:&error]) { //breakpoint in here

    //some code
}

该应用程序似乎一直在等待并且再也没有回来恢复它的执行?这就是我在video 中的意思。这可能是因为实体/关系模型有问题吗?

这是泄漏工具的屏幕截图,我没有看到任何泄漏,但似乎应用程序正在分配一些积累的东西:

【问题讨论】:

标签: iphone objective-c ipad core-data


【解决方案1】:

您是否尝试过放弃多线程代码以查看它是否有效?我的猜测是你在这里混合了线程并从不同的线程访问/保存 MOC。手动管理线程是一个 PITA,你应该尝试切换到Grand Central Dispatch

我还会为您的主 MOC 提供自己的访问器,这样您就可以确保它不是从后台线程调用的,并且有一些:- (NSManagedObjectContext*)newBackgroundMOC;- (void)saveBackgroundMOC:(NSManagedObjectContext*)context; 方法可以从后台队列/线程中快速创建和保存 MOC :

dispatch_async(my_queue, ^{
    NSManagedObjectContext *context = [self newBackgroundMOC]; // create context, setup didSave notification to merge with main MOC, etc

    // modify context

    [self saveBackgroundMOC:context]; // main MOC gets updated
});

迁移到 GCD 需要一些工作,但从长远来看,您会发现使用它会更愉快。不用说,它也是 Apple 最现代和推荐的处理线程的方式。

【讨论】:

  • 用仪器泄漏分析器的屏幕截图编辑了我的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-23
  • 2011-07-03
  • 1970-01-01
  • 2017-05-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多