2010-01-19 4 views
1

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.

Répondre

0

Je recommande que l'objet AsyncNetworkOperation appelle l'objet délégué dans le même thread sur lequel il a été appelé. Donc, si l'opération async a été invoquée pour la première fois sur le thread principal, alors elle devrait appeler le délégué sur le thread principal!

Vous pouvez imaginer une utilisation future où le délégué n'a pas besoin de mettre à jour l'interface utilisateur et l'appeler à partir d'un thread secondaire serait bon.

+0

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. –

+0

@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

+0

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.) –

Questions connexes