Navigation à partir du bloc de retour
J'ai ce que je pense est un UX opération qui se produit sur un thread d'arrière-plan. Dans une méthode qui utilise des blocs, dans le succès je l'appelle:
[self.navigationController popViewControllerAnimated:TRUE];
Je suis arriver un accident, alors je pense que la vérification du thread courant et en appelant performSelectorOnMainThread pourrait résoudre ce problème, mais je ne suis pas sûr de savoir comment le programme d'installation de l' @sélecteur partie de l'appel.
[self performSelectorOnMainThread:@selector([self.navigationController popViewControllerAnimated:TRUE]) withObject:nil waitUntilDone:NO];
ne fonctionne pas. Quelle est la bonne syntaxe?
Juste un point mineur, mais objective-c BOOL valeurs sont
YES,NO
, pas TRUE,FALSE
.OriginalL'auteur Rob Bonner | 2013-12-28
Vous devez vous connecter pour publier un commentaire.
À la force de la méthode à exécuter dans le thread principal, vous pouvez utiliser:
Eh, c'est un tirage au sort pour moi... [[NSOperationQueue mainQueue] addOperationWithBlock est plus polyvalent car il prend en charge plus de fonctions comme stop/start, dépendances etc. Mais le langage de bas niveau dispatch_async(dispatch_get_main_queue() (c'est à dire PGCD) est un peu plus rapide. Suppose que cela dépend de ce que vous avez besoin... Mais depuis popViewControllerAnimated: dans ce cas, est une opération rapide, peut-être qu'il n'a pas besoin de toutes les cloches et de sifflets de la [[NSOperationQueue mainQueue] addOperationWithBlock...
Pour moi c'est pas sur les fonctionnalités supplémentaires, c'est une question qui est plus lisible. Et la vitesse des questions si vous testez votre code et trouver qu'il est lent. - Je trouver de l'Objective-C beaucoup plus lisible que les droites C, et le "mainQueue" dans l'Objective-C interface sauts beaucoup plus que la dispatch_get_main_queue() en C. Si vous croyez en Objective-C, vous restez en Objective-C, quand vous le pouvez.
OriginalL'auteur Lyndsey Scott
Strictement parlant, vous ne pouvez pas faire ce que vous voulez en raison des contraintes de comment
-performSelectorOnMainThread:
œuvres. Cependant, quelle que soit la classeself
est, vous pouvez définir une méthode comme ceci:puis
À élaborer les raisons de la syntaxe ne fonctionne pas:
Le sélecteur passe à
-performSelectorOnMainThread:
doit être un sélecteur qui soit ne prend pas d'argument, ou un seul argument d'une sorte deid
. Alors que-popViewControllerAnimated:
est un sélecteur qui prend un seul argument, l'argument est de typeBOOL
(qui utiliseYES
etNO
pasTRUE
etFALSE
).Ainsi, la
@selector
sera juste le nom de la méthode, l'objet que vous souhaitez appeler (dans ce cas,self.navigationController
).Penser en termes d'objets de messagerie. Vous voulez la
self.navigationController
objet pour effectuer le-popViewControllerAnimated:
sélecteur sur le thread principal, de sorte que vous serait de construire la messagerie de cette façon:Mais le problème, c'est, encore une fois, l'argument requis. Donc, puisque vous ne pouvez pas invoquer directement
pop
de cette manière, c'est pourquoi ma suggestion ci-dessus. Il vous permet de vous faire invoquerperform
en fonction de sa sémantique, puis encore appelpop
correctement avec sa sémantique.OriginalL'auteur hsoi