Reputation: 8563
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.
Upvotes: 1
Views: 2299
Reputation: 16443
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.
Upvotes: 6