【问题标题】:Error 133000 when using multiple contexts with core data将多个上下文与核心数据一起使用时出现错误 133000
【发布时间】:2012-08-01 13:34:33
【问题描述】:

我花了几天时间尝试所有我能想到的解决这个问题的方法,但似乎没有任何效果。

我运行这样一个后台线程:

[MagicalRecord saveInBackgroundWithBlock:^(NSManagedObjectContext *localContext) {

                    Media *localMedia = [media inContext:localContext];

                    UIImage *image = localMedia.thumbnail;


                    dispatch_async(dispatch_get_main_queue(), ^{

                        [thumbnails setObject:image forKey:[NSNumber numberWithInt:i]];
                        [contentDict setObject:thumbnails forKey:@"MediaItems"];
                        [cell.entryView setNeedsDisplay];
                    });

                }];

或者像这样:

dispatch_queue_t cellSetupQueue = dispatch_queue_create("com.Journalized.SetupTimelineThumbnails", NULL);
            dispatch_async(cellSetupQueue, ^{

                NSManagedObjectContext *newMoc = [[NSManagedObjectContext alloc] init];
                NSPersistentStoreCoordinator *coordinator = [NSManagedObjectContext contextForCurrentThread].persistentStoreCoordinator;
                [newMoc setPersistentStoreCoordinator:coordinator];

                NSNotificationCenter *notify = [NSNotificationCenter defaultCenter];
                [notify addObserver:self
                           selector:@selector(mergeChanges:)
                               name:NSManagedObjectContextDidSaveNotification
                             object:newMoc];

Media *localMedia = [media inContext:[NSManagedObjectContext contextForCurrentThread];

                        UIImage *image = localMedia.thumbnail;


                        dispatch_async(dispatch_get_main_queue(), ^{

                            [thumbnails setObject:image forKey:[NSNumber numberWithInt:i]];
                            [contentDict setObject:thumbnails forKey:@"MediaItems"];
                            [cell.entryView setNeedsDisplay];
                        });

                    }];

这两个都让我崩溃了,UIImage 作为 nil 对象返回,Cocoa Error 133000

我已经删除了所有其他后台线程代码,并在此之前直接保存在主线程中以确保。在主线程上运行上面的代码也可以,但会冻结我的 UI。尽管做了所有这些努力,但上述代码每次都会崩溃。

我不知道该怎么做才能完成这项工作。

编辑:

具体来说,我的问题是如何在不崩溃的情况下完成这项工作?来自 1 个上下文的对象在另一个上下文中不存在似乎是一个问题,但是我如何使它们存在于另一个上下文中?

【问题讨论】:

  • 您的问题是什么?您正在使用 RestKit 吗?而且您的代码 sn-ps 非常不完整-我什么都听不懂。观察者方法几乎绝对不是你想要的,第一个例子可能由于 saveInBackgroundWithBlock 内部的东西而崩溃:
  • 这可能是因为 Core Data 不是线程安全的。你试过 [localContext performBlock:^{}];
  • @PauldeLange 我没有使用 RestKit,不。作为观察者方法,我应该有什么?

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


【解决方案1】:

记住,MR_inContext: 方法在后台使用 [NSManagedObjectContext objectWithID: ] 方法。您应该在那里查看以确保您的对象具有:

1) 在进入您的第一个代码块中的后台上下文/块之前已保存 2) 这个方法返回了一些有用的东西

我也不确定您是如何设置缩略图属性的。理想情况下,只要您编写了 NSTransformable 代码就没有关系(互联网上有示例向您展示如何使用可转换属性将 UIImage 保存在核心数据中)

此外,您的代码应如下所示:

UIImage *image = nil;
[MagicalRecord saveInBackgroundWithBlock:^(NSManagedObjectContext *localContext) {

  Media *localMedia = [media inContext:localContext]; //remember, this looks up an existing object. If your context is a child of a parent context that has contains this, the localContext should refresh the object from the parent.

  //image processing/etc

  image = localMedia.thumbnail;

} completion:^{              

    [thumbnails setObject:image forKey:@(i)]; //new literals are teh awesome
    contentInfo[@"MediaItems"] = thumbnails;  //as is the new indexer syntax (on the latest compiler)

    [cell.entryView setNeedsDisplay];

}];

【讨论】:

  • “在进入您的第一个代码块中的后台上下文/块之前已保存”是我的问题。在我的后台线程中,我正在获取尚未保存在主线程中的项目。
【解决方案2】:

快速回答:

NSManagedObjectReferentialIntegrityError = 133000, // 尝试触发一个指向不存在的对象的故障(我们可以看到存储,我们看不到对象)

编辑: 从代码中很难看到一些东西。那里的托管对象是什么?

我想问题是您在另一个上下文中使用来自一个上下文的临时对象。

【讨论】:

  • 公平地说,从来没有问题,但这也不是答案。
  • @PauldeLange 我的印象是他甚至不知道错误代码的含义,所以在查看代码之前添加错误描述是第一件事。
  • 我如何使对象成为非临时对象?
  • 你必须保存它们。使用多个上下文并不容易。您是否考虑过只使用一个共享上下文?
  • @Sulthan 上下文不是线程安全的。我需要在后台线程上处理一些事情。
猜你喜欢
  • 2012-01-28
  • 1970-01-01
  • 2013-12-27
  • 2023-04-02
  • 2019-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-21
相关资源
最近更新 更多