2009-04-30 7 views
3

Vous trouverez ci-dessous un bloc de code qui s'exécute dans un thread distinct du thread principal de mon application. Comment puis-je mettre l'interface à jour après chaque vignette? Pour l'instant, il ne se met pas à jour tant que la méthode n'est pas terminée. Les boutons sont déjà ajoutés à un UIScrollView.Comment puis-je mettre à jour l'interface utilisateur au milieu de ce fil?

(LotsGridButton est juste un UIButton avec des propriétés supplémentaires.)

- (void)fetchThumbnails { 
    CCServer* server = [[CCServer alloc] init]; 
    for (int i=0; i<[buttons count]; i++) { 
     LotsGridButton* button = [buttons objectAtIndex:i];  
     if (button.lot.thumbnail) continue; 
     // load the thumbnail image from the server 
     button.lot.thumbnail = [server imageWithPath:button.lot.thumbnailURL]; 
     [button setImage:button.lot.thumbnail forState:UIControlStateNormal]; 
    } 
    [server release]; 
} 

Répondre

5

Au lieu de setImage:forState:, jetez un oeil à la méthode performSelectorOnMainThread:, par exemple .:

[myButton performSelectorOnMainThread:@selector(setThumbnail:) withObject:[server imageWithPath:myButton.lot.thumbnailURL] waitUntilDone:NO]; 
+0

doux! cela a fonctionné, une fois que j'ai fait une méthode wrapper (puisque performSelector ne prend qu'un argument et setImage: forState: prend 2). est-ce une instance d'un modèle général, comme "changer le widget dans le thread principal et il va montrer ses changements tout de suite"? – lawrence

+0

Sur l'iPhone, au moins, les mises à jour de l'interface utilisateur ont lieu sur le fil principal. Vous ne pouvez pas mettre à jour de manière fiable les widgets à partir des threads d'arrière-plan. Ainsi, en exécutant une méthode sur le thread principal qui effectue les mises à jour de l'interface utilisateur, vous avez plus de chances d'obtenir des mises à jour plus rapides de l'interface utilisateur. –

3

Je n'ai pas d'expérience avec l'iPhone, mais à Cocoa en général, vous êtes censé mettre à jour l'interface utilisateur uniquement à partir du thread principal.

D'un autre thread que vous pouvez exécuter du code dans le thread principal à l'aide de NSObject:

performSelectorOnMainThread:withObject:waitUntilDone: 
Questions connexes