2012-02-24 4 views
1

Je développe une application iOS utilisant iOS 5.de base de données et Grand Central Dispatch interne Incohérence

Je ne parviens pas à l'aide de grande expédition centrale pour remplir une vue d'un GMGridViewCell.

Le problème est pas avec le GridCell elle-même, mais avec l'accès aux données GCD.

Voici mon 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; 
} 

Lorsque vous exécutez l'application que je reçois l'erreur suivante:

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

Qu'est-ce que je fais mal?

EDIT Plus d'infos,

La première ligne qui lève l'exception:

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

Et je crois que le problème est de GCD parce que quand je lance ce sans GCD cela fonctionne très bien. Mais le défilement de la grille est un peu lent, c'est pourquoi je veux y ajouter GCD.

+0

vous devez ajouter plus de détails. Où est ce crash dans le code? Comment savez-vous que la méthode ci-dessus est le coupable? – Rog

+0

@Rog J'ai ajouté plus d'infos. Fondamentalement, cela fonctionne bien lorsque vous n'utilisez pas GCD, mais le défilement est un peu lent. –

+0

Vous ne devriez pas non plus dispatch_sync() dans la file d'attente principale, vous devez soumettre toutes les requêtes à cette file async (le comportement de la file d'attente principale n'est pas ce que vous pensez). – jkh

Répondre

6

Je crois que le problème est avec self.foundItems, que je devine est le résultat d'une demande NSFetchRequest dans un autre fil. NSManagedObject ne peut pas être passé entre les threads. Vous devez aller chercher les objets dans le même fil que vous allez utiliser.

+0

Je crois que c'est ça. Je vais regarder dans cela. –

+0

@chris, ai-je besoin d'aller chercher un objet pour chaque cellule? Cela rend ma table léthargique. –

+0

@ValentinShamardin Votre meilleur pari est de simplement récupérer les éléments dans le même fil que vous utiliserez. – chris

Questions connexes