1
votes

I am developing an iOS app using iOS 5.

I am having trouble using grand central dispatch to fill a view for a GMGridViewCell.

THe problem is not with the GridCell it self, but with the access to data in GCD.

Here is my code:

- (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;
}

When running the app I get the following error:

*** 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)

What am I doing wrong?

EDIT More info,

The first line that throws the exception:

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

And I believe the problem is from GCD because when I run this without GCD it works fine. But the scrolling of the grid is a bit sluggish, which is why I want to add GCD to it.

1
you need to add more details. where in the code is this crash occurring? How do you know the method above is the culprit? - Rog
@Rog I have added more info. Basically this works fine when not using GCD, but the scrolling is a bit sluggish. - Tiago Veloso
You should also not dispatch_sync() to the main queue, you should submit all requests to that queue async (the behavior for the main queue isn't what you think it is). - jkh
@jkh Yeah, I figure you are right. I was trying something out before posting here. - Tiago Veloso

1 Answers

6
votes

I believe the problem is with self.foundItems, which I'm guessing is the result of an NSFetchRequest request in another thread. NSManagedObject cannot be passed between threads. You have to fetch the objects in the same thread you're going to use it.