我正在将我的项目转换为ARC,当我到达负责在后台下载一些图像的一些NSOperation
子类时,代码开始崩溃。
所以我有我的NSOperation
子类及其主要代码:
- (void)main
{
Post *p = [[Post alloc] initWithNewManagedObjectContext];
Post *post = (Post *)[p findById:postId];
[post downloadAndProcessImageOfTypeThumbOrAll:thumbOrAll];
if (![self isCancelled]) {
[target performSelectorOnMainThread:afterCompletionAction withObject:postId waitUntilDone:NO];
}
}
代码在没有 ARC (并且有适当的版本)的情况下编译时有效,但是当它转换为ARC时,它在完成main方法后立即收到 EXC_BAD_ACCESS 异常。< / p>
我猜这是与ARC相关的东西,它应该发布任何对象,也许是Posts对象。但我不知道如何更长时间地保留它们。
此外,[[Post alloc] initWithNewManagedObjectContext];
创建或重用现有上下文以从CoreData访问对象。
任何提示?
答案 0 :(得分:0)
实际上,有朋友帮我找到了这个问题。 感谢每一条评论。
问题在于NSManagedObjectContext
,后台线程正在访问它。
解决方案是为后台线程创建一个新的上下文,如果需要,使用的技巧是将上下文存储在threadDictionary
上以供其他后台线程访问。
现在,[[Post alloc] initWithNewManagedObjectContext];
创建了一个单独的上下文:
NSManagedObjectContext *managedObjectContext = nil;
NSThread *thread = [NSThread currentThread];
managedObjectContext = [[thread threadDictionary] valueForKey:@"managedObjectContext"];
if (!managedObjectContext) {
GTCoreData *gtcd = [[GTCoreData alloc] init];
NSPersistentStoreCoordinator *coordinator = [gtcd persistentStoreCoordinator];
if (coordinator != nil) {
managedObjectContext = [[NSManagedObjectContext alloc] init];
[managedObjectContext setPersistentStoreCoordinator:coordinator];
[[thread threadDictionary] setValue:managedObjectContext forKey:@"managedObjectContext"];
}
}
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Post" inManagedObjectContext:managedObjectContext];
Post *post = [[Post alloc] initWithEntity:entity insertIntoManagedObjectContext:managedObjectContext];
return post;