J'ai défini une classe appelée 'AsyncNetworkOperation', une sous-classe de NSOperation utilisée pour effectuer des requêtes de base de données dans mon application. Ma classe AsyncNetworkOperation a un protocole, pour être utilisé par des objets qui initient la AsyncNetworkOperation:Rappelez-vous de déléguer en utilisant le thread principal plutôt que le thread secondaire?
@protocol AsyncNetworkOperationDelegate
@optional - (void)operationAboutToFinish;
@required - (void)operationFinishedWithData:(id)retrievedData;
@required - (void)operationFinishedWithError:(NSError*)error;
@end
Tout cela fonctionne très bien, sauf dans le cas où le délégué j'appelle de nouveau à veut montrer un UIAlertView, démarrer une NSTimer, ou faire quelque chose d'autre que les threads secondaires ne sont pas censés faire, ou nécessitent un effort supplémentaire à faire.
Alors voici ma question: quand je rappelle le délégué, devrais-je le faire via - [NSObject performSelectorOnMainThread:]? Il semblerait que, ce faisant, je décharge mon délégué du fardeau d'avoir à savoir s'il est rappelé par un thread secondaire ou primaire, lui permettant ainsi de mettre en œuvre la fonctionnalité de la manière la plus directe possible, sans aucune limitation.
Je m'interroge sur la manière standard d'aborder ce problème.
Merci.
Quelle est la meilleure façon de faire cela? Ma meilleure estimation: 1) Lorsque l'opération async est démarrée, appelez + [NSThread currentThread] pour obtenir le thread sur lequel l'opération a été appelée. Stocker dans une variable d'instance. 2) Lorsque l'opération est terminée, appelez le délégué en utilisant - [NSObject performSelector: onThread: withObject: waitUntilDone:], en passant le thread stocké via le paramètre onThread:. Cela semble-t-il correct, ou existe-t-il une façon plus propre de le faire? Merci. –
@Greg, cela semble à peu près juste si vous créez vous-même des threads. Sinon, cela peut ne pas être nécessaire. – notnoop
J'instance simplement une NSOperation et l'ajoute à une NSOperationQueue. Est-ce que vous voulez dire par "créer des fils"? (Je pose cette question uniquement parce qu'une documentation de Cocoa semble presque impliquer que l'utilisation de NSOperation est un moyen de contourner la création de threads ... quand ma compréhension de la façon dont cela fonctionne est que NSOperationQueue crée un thread pour moi.) –