for循环随机挂在executeFetchRequest上:错误:

Mat*_*McN 3 iphone cocoa core-data objective-c ios

我最近在我的iOS应用程序中遇到了一个奇怪的问题,并且不知道如何修复它.

在第一次运行期间,有一种在后台运行的方法,该方法从游戏中下载项目和项目属性列表,并将其存储在Core Data中以供以后的关系使用.处理项目的import方法部分如下所示:

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"];
    ...
}
Run Code Online (Sandbox Code Playgroud)

在此之前是另一个循环,除了在SchemaItem上处理Attribute实体而不需要自己创建任何关系之外,它运行正常.

这个循环的问题在于循环将随机循环[managedObjectContext_ executeFetchRequest:fetch error:nil],我将在控制台中记录"1"而不是紧随其后的"2".然而,有什么奇怪的是,有时循环会成功运行,没有问题.

虽然这是不是很好的循环运行正常,有时,它给我留下了无法知道是什么原因造成它挂在executeFetchRequest:error:每个其他时间.

谁能在这里看到我错过的东西?我的头已被炒了2天了.

bbu*_*bum 8

哈,是吗?

听起来像是一个并发问题; 你的锁是错误的嵌套.当它挂起时,进入调试器(按下暂停按钮)并查看所有线程的回溯.更有可能的是,你会发现两个(或更多)线程楔在一个锁上.

正如Daniel T所建议的那样,您必须阅读Core Data并发指南.

一个常见的错误是认为只读操作是自动线程安全的.