2010-08-28 11 views
0

J'ai un thread (en particulier un NSOperation) qui fonctionne pour charger des images pour moi pour une vue de défilement lorsque ma vue principale les demande. N'importe quel nombre de ces NSOperations peut être mis en file d'attente à la fois. Donc ça va avec le chemin de fichier que je lui donne et charge l'image depuis le disque (comme UIImages) puis renvoie l'objet à ma vue principale en utilisant performSelectorOnMainThread: et en passant ma mainview un NSDictionary de l'objet, et une valeur d'image ID. Ma vue principale est alors censée insérer l'objet image et la chaîne d'identification de l'image dans un NSMutableDictionary dont elle dispose pour que la vue principale puisse l'utiliser. J'ai vérifié que NSMutableDictionary est alloué et initialisé correctement, mais lorsque la méthode que les appels NSOperation essaie d'ajouter les objets au dictionnaire ne se passe rien. J'ai vérifié que l'objet et la chaîne que je reçois du dictionnaire que le fil m'a envoyé ne sont pas nulles ou quoi que ce soit mais cela ne fonctionne pas. Est-ce que je ne fais pas quelque chose de bien ou n'utilise pas une mauvaise technique? Qu'est-ce que quelqu'un suggère de faire dans une situation comme celle-ci où j'ai besoin d'ajouter UIImages à un NSMutableDictionary à partir d'un thread? Merci beaucoup!iPhone: Impossible de définir l'objet reçu à partir de thread dans NSMutableDictionary

Voici le code NSOperation J'utilise:

- (void)main { 
    NSString *filePath = [applicaitonAPI getFilePathForCachedImageWithID:imageID andSize:imageSize]; 
    UIImage *returnImage = [[UIImage alloc] initWithContentsOfFile:filePath]; 

    if (returnImage) { 
     NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithCapacity:2]; 
     [dict setObject:returnImage forKey:@"IMAGE"]; 
     [dict setValue:[NSString stringWithFormat:@"%d", imageID] forKey:@"IMAGE_ID"]; 
     NSDictionary *returnDict = [[NSDictionary alloc] initWithDictionary:dict]; 
     [dict release]; 
     [mainViewController performSelectorOnMainThread:@selector(imageLoaderLoadedImage:) withObject:returnDict waitUntilDone:NO]; 
     [returnDict release]; 
    } 
} 

Et voici la méthode sur le thread principal:

- (void)imageLoaderLoadedImage:(NSDictionary *)dict { 
    UIImage *loadedImage = [dict objectForKey:@"IMAGE"]; 
    NSString *loadedImage = [dict valueForKey:@"IMAGE_ID"]; 
    [imagesInMemoryDictionary setObject:loadedImage forKey:loadedImageID]; 
    [self drawItemsToScrollView]; 
} 
+0

Publier du code. –

+0

@Dave Delong ok J'ai ajouté du code. – Alexander

+0

Le code que j'avais en dernier était erroné en ce sens qu'il montrait que je passais nil au fil principal alors qu'en fait je ne le suis pas, c'était une faute de frappe. – Alexander

Répondre

1
[mainViewController performSelectorOnMainThread:@selector(imageLoaderLoadedImage:) withObject:nil waitUntilDone:NO]; 

Vous n'êtes pas passer returnDict comme paramètre à la méthode . Vous passez nil.

Quelques autres pensées:

  • vous n'avez pas besoin de créer returnDict. Vous pouvez simplement utiliser dict comme paramètre de méthode.
  • vous avez des fuites returnImage.

modifier

Puisque vous semble-t-sont passant returnDict comme paramètre à la méthode, mon autre hypothèse serait que mainViewController est nil. A part ça, votre code semble fonctionnel.

+0

Exactement, lorsque vous appelez une méthode utilisant un sélecteur, vous devez passer les arguments dans "withObject". Merci à @Dave DeLong en premier lieu. – jsicary

+0

Oups c'est en fait un changement que j'ai fait dans le code en testant quelque chose, j'envoie vraiment le dict. Pardon. – Alexander

+0

Eh bien c'est bizarre, parce que je sais que mainviewcontroller la méthode est appelée et même les objets que j'ai vérifiés ne sont pas nuls et la chaîne qui est passée est enregistrée et sort très bien. Mais quand j'essaie de l'insérer dans le dictionnaire rien ne se passe! Si frustrant! – Alexander