2010-04-15 4 views
0

Je viens de rencontrer cette étrange situation.question conceptuelle: qu'est-ce performSelectorOnMainThread faire?

j'utilisais la technique de chargement d'images paresseuse des exemples de pomme.

quand j'utilisé la classe dans mon application, il m'a donné le sujet à apprendre, mais ne pas ce qui se passe là-bas en fait.

Alors, voici le scénario:

Je pense que tout le monde a vu le lazytableimagesloading de pomme.

Je rechargeait ma table sur la finition l'analyse syntaxique des données:

- (void)didFinishParsing:(NSMutableArray *)appList 
    { 


    self.upcomingArray = [NSMutableArray arrayWithArray:loadedApps]; 

    // we are finished with the queue and our ParseOperation 
[self.upcomingTableView reloadData]; 


     self.queue = nil; // we are finished with the queue and our ParseOperation 

    } 

mais en raison de la connexion n'a pas été le démarrage et les images ont été ne se charge pas. quand je copie complètement le lazyimageloading et je l'ai remplacé le code ci-dessus avec le code suivant, il fonctionne très bien

- (void)didFinishParsing:(NSMutableArray *)appList 
{ 


[self performSelectorOnMainThread:@selector(handleLoadedApps:) withObject:appList waitUntilDone:NO]; 


    self.queue = nil; // we are finished with the queue and our ParseOperation 

} 

Je veux savoir quel est le concept derrière tout cela.

S'il vous plaît laissez-moi savoir si vous ne pouvez pas comprendre la question ou les détails ne sont pas assez parce que je veux désespérément savoir pourquoi il est comme ça?

LazyTableImages

Répondre

3

Cette méthode invoque simplement une méthode de votre choix mais afin qu'il soit exécuté sur le thread principal. Le thread principal est, entre autres, chargé de mettre à jour l'interface utilisateur et de gérer la boucle d'exécution principale de l'application. Même l'objet NSApplication gère les événements sur le thread principal. Par conséquent, vous utilisez cette méthode en passant en argument la méthode que vous voulez exécuter en utilisant un sélecteur Objective-C, un objet qui est censé représenter l'entrée de votre méthode ou nil si votre méthode ne nécessite pas d'argument, et enfin une valeur booléenne indiquant si vous voulez bloquer jusqu'à ce que votre méthode soit exécutée ou si vous voulez plutôt retourner immédiatement sans attendre que votre méthode soit exécutée.

Si votre méthode nécessite plus d'un argument, vous enroulez tous les arguments requis dans, par exemple, un NSDictionary et transmettez l'objet dictionnaire comme deuxième argument.

Dans votre cas, afin de recharger la table, vous devez mettre à jour l'interface utilisateur dans le thread principal.

+0

Ainsi, le NSURLConnection n'exécute Si j'exécute le rechargement de la table dans thread principal, non? – harshalb

+1

@hib NSURLConnection n'a rien à voir avec le rechargement de la table. Si vous avez une méthode qui est effectuée sur un thread d'arrière-plan, mais qu'elle doit mettre à jour l'interface utilisateur à un moment donné, cette mise à jour de l'interface utilisateur doit être effectuée sur le thread principal. –

Questions connexes