【发布时间】: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