核心数据和Grand Central调度内部不一致

时间:2012-02-24 18:08:07

标签: ios core-data grand-central-dispatch

我正在使用iOS 5开发iOS应用程序。

我无法使用盛大的中央调度来填充GMGridViewCell的视图。

问题不在于GridCell本身,而是在GCD中访问数据。

这是我的代码:

- (GMGridViewCell *)GMGridView:(GMGridView *)gridView cellForItemAtIndex:(NSInteger)index
{
    //NSLog(@"Creating view indx %d", index);

    CGSize size = [self sizeForItemsInGMGridView:gridView];

    GMGridViewCell *cell = [gridView dequeueReusableCell];

    if (!cell) 
    {
        cell = [[GMGridViewCell alloc] initWithFrame:CGRectMake(0, 0, size.width, size.height)];
    }

    [[cell.contentView subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];

    dispatch_queue_t fillCellQueue = dispatch_queue_create("Cell fetch queue", NULL);
    dispatch_async(fillCellQueue, ^{
        SearchGridViewCell *cellView = [UIView loadFromNib:@"SearchGridViewCell" owner:self];
        Item *item = [self.foundItems objectAtIndex:index];

        cellView.itemImageView.image = [UIImage imageWithData:item.image.thumb];

        cellView.itemNameLabel.text  = item.name; 

        cellView.brandImageView.image = [UIImage imageWithData:item.group3.image.thumb];

        Attribute *itemAttribute = [item.attributes objectAtIndex:0];
        cellView.attributeLabel.text  = [itemAttribute.name stringByAppendingFormat:@": "];
        [cellView.attributeLabel sizeToFit];

        cellView.itemAttributeValueLabel.text = itemAttribute.value;
        [cellView.itemAttributeValueLabel sizeToFit];

        dispatch_sync(dispatch_get_main_queue(), ^{
            [cell addSubview:cellView];
        });
    });
    dispatch_release(fillCellQueue);

    return cell;
}

运行应用程序时出现以下错误:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'statement is still active'
*** First throw call stack:
(0x1a1f052 0x35b3d0a 0x11cde0a 0x11cd58d 0x11f689f 0x11ec955 0x11d7df4 0x11f6418 0x11f3b62 0x11f3a57 0x11f316b 0x11f2f97 0x11f2b75 0x11f29f2 0x1236e10 0x51de7 0x44ab445 0x44acecf 0x44acd28 0x44ac4af 0x91442b24 0x914446fe)

我做错了什么?

编辑更多信息,

抛出异常的第一行:

cellView.itemImageView.image = [UIImage imageWithData:item.image.thumb];

我相信这个问题来自GCD,因为当我在没有GCD的情况下运行它时,它运行正常。但是网格的滚动有点迟钝,这就是为什么我要为它添加GCD。

1 个答案:

答案 0 :(得分:6)

我认为问题出在self.foundItems,我猜这是另一个线程中NSFetchRequest请求的结果。 NSManagedObject无法在线程之间传递。你必须在你将要使用它的同一个线程中获取对象。