for循环随机挂在executeFetchRequest:错误:
Posted
技术标签:
【中文标题】for循环随机挂在executeFetchRequest:错误:【英文标题】:for loop randomly hanging on executeFetchRequest:error: 【发布时间】:2011-03-20 23:40:19 【问题描述】:我的 ios 应用最近遇到了一个奇怪的问题,不知道该如何解决。
在第一次运行期间,有一个在后台运行的方法,它从游戏中下载物品列表和物品属性,并将其存储在 Core Data 中以供以后的关系使用。处理项目的导入方法部分如下所示:
NSManagedObject *item;
for (TFSchemaItem *tfItem in [bs items])
item = [NSEntityDescription insertNewObjectForEntityForName:@"SchemaItem" inManagedObjectContext:managedObjectContext_];
NSLog(@"%@", [tfItem itemName]);
[item setValue:[tfItem itemName] forKey:@"itemName"];
[item setValue:[NSNumber numberWithInteger:[tfItem defindex]] forKey:@"defindex"];
[item setValue:[tfItem itemClass] forKey:@"itemClass"];
[item setValue:[tfItem type] forKey:@"itemType"];
[item setValue:[tfItem name] forKey:@"tfName"];
[item setValue:[NSNumber numberWithInteger:[tfItem slot]] forKey:@"itemSlot"];
[item setValue:[NSNumber numberWithInteger:[tfItem quality]] forKey:@"itemQuality"];
[item setValue:[[tfItem imageURL] absoluteString] forKey:@"imageURL"];
[item setValue:[[tfItem largeImageURL] absoluteString] forKey:@"largeImageURL"];
[item setValue:[NSNumber numberWithInteger:[tfItem craftClass]] forKey:@"craftClass"];
[item setValue:[tfItem itemDescription] forKey:@"tfDescription"];
[item setValue:[NSNumber numberWithBool:[tfItem properName]] forKey:@"properName"];
NSFetchRequest *fetch = [[NSFetchRequest alloc] init];
NSMutableArray *attrArray = [[NSMutableArray alloc] init];
for (TFItemAttribute *attr in [tfItem attributes])
[attrArray addObject:[NSNumber numberWithInt:[attr defindex]]];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"defindex IN %@", attrArray];
[attrArray release];
[fetch setEntity:[NSEntityDescription entityForName:@"Attribute" inManagedObjectContext:managedObjectContext_]];
[fetch setPredicate:predicate];
[fetch setReturnsObjectsAsFaults:NO];
NSLog(@"1");
NSArray *fetchArray = [managedObjectContext_ executeFetchRequest:fetch error:nil];
NSLog(@"2");
[item setValue:[NSSet setWithArray:fetchArray] forKey:@"attributes"];
...
在这之前是另一个循环,除了在 SchemaItem 上处理 Attribute 实体并且不需要自己创建任何关系之外,它是相同的,运行良好。
这个循环的问题是循环会随机挂在[managedObjectContext_ executeFetchRequest:fetch error:nil]
,我会在控制台中得到记录的“1”,而不是之后的“2”。不过,奇怪的是,有时循环会成功运行,没有问题。
虽然循环运行良好有时有点好,但它让我无法知道是什么导致它每隔一段时间就挂在executeFetchRequest:error:
上。
这里的任何人都可以看到我错过的东西吗?我的头已经被它炒了 2 天了。
【问题讨论】:
我将首先尝试捕获executeFetchRequest:error:
返回的错误,您可能会发现一些东西。
@TechZen:我试过了,但是这条线一旦挂起就不会执行,所以即使它产生了错误我也无法检查。
你是否在 obj_c_exception_throw 上设置了断点?它可能会捕获更好的堆栈跟踪并为您提供继续工作的机会。
你说这个循环是在后台运行的……你读过如何在多线程中使用 Core Data 吗?你的 moc 是这个线程独有的吗?
是的,调试时总是打开那个断点。它只是完全停止执行,没有抛出异常。
【参考方案1】:
挂,嗯?
听起来像是并发问题;你的锁嵌套错误。当它挂起时,进入调试器(按下暂停按钮)并查看所有线程的回溯。很有可能,您会发现两个(或更多)线程卡在一个锁上。
正如 Daniel T 所建议的,您必须阅读Core Data concurrency guide。
一个常见的错误是认为只读操作是自动线程安全的。
【讨论】:
伙计,我现在觉得自己很愚蠢。第一个循环应该是锁定和解锁,我只是忘记锁定和解锁这个。现在似乎工作正常,尽管我一直在关注它。谢谢 bbum 和丹尼尔! 核心日期并发指南已移动:developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/…以上是关于for循环随机挂在executeFetchRequest:错误:的主要内容,如果未能解决你的问题,请参考以下文章