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:错误:的主要内容,如果未能解决你的问题,请参考以下文章

来自for循环中随机序列的html表

如何在没有 for 循环的情况下生成 n 个随机数

java中的随机循环怎么做?

使用 for 循环生成随机数量的多边形及其 XYZ 值

如何正常在 git 操作的 sh 中随机运行 for 循环?

如何将数组中的类随机分配给for循环中创建的元素