2011-09-06 1 views
1

créer un nouveau fil d'un contrôleur comme ceci:Echanger des données entre objets/sujets à Cocoa

[NSThread detachNewThreadSelector:@selector(makeMovie) toTarget:movieMaker withObject:nil]; 

Quelle est la meilleure façon d'appeler des méthodes sur le contrôleur du nouvel objet/filetage MovieMaker?

Répondre

2

Dans ce cas, vous souhaitez probablement utiliser le modèle délégué. Dans votre fichier .h de classe film-maker:

@protocol MovieMakerDelegate; 

@interface MovieMaker : NSObject 
{ 
    id<MovieMakerDelegate> delegate; 

    ... 
} 

@property (nonatomic, assign) id<MovieMakerDelegate> delegate; 

... 

@end 

@protocol MovieMakerDelegate <NSObject> 
- (void)movieMaker:(MovieMaker *)maker didSomething:(id)result; 
@end 

... et dans son .m:

@implementation MovieMaker 

@synthesize delegate; 

... 

- (void)makeMovie 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    ... 

    [self performSelectorOnMainThread:@selector(notifyDelegateOfDoingSomethingWithObject:) withObject:someObject waitUntilDone:YES]; 

    [pool release]; 
} 

- (void)notifyDelegateOfDoingSomethingWithObject:(id)someObject 
{ 
    [self.delegate movieMaker:self didSomething:someObject]; 
} 

... 

@end 

Puis, dans l'en-tête de votre contrôleur, déclare qu'il prend en charge le protocole MovieMakerDelegate, comme ceci:

@interface MyController : Whatever <MovieMakerDelegate> 

et dans votre .m, avant d'appeler votre -detachNewThreadSelector:etc:, appelez movieMaker.delegate = self;. Implémentez la méthode -movieMaker:didSomething: sur votre classe de contrôleur et vous êtes prêt à partir.

+0

merci pour votre réponse. Bien que cette fois je pense qu'il y avait une solution plus simple que j'ai besoin seulement d'appeler une méthode, mais je vais certainement l'utiliser plus tard. Merci. – whg

+1

@whg: Cela n'a pas d'importance. Une vue ne devrait généralement pas connaître son contrôleur de toute façon. Cela vaut toujours la peine d'en faire une relation de délégué, avec un protocole, même si le protocole n'aura qu'une seule méthode. Cela facilite la réutilisabilité et la modifiabilité (il sera plus facile de changer cette application ou de faire un nouveau/port à une plate-forme différente). –

2

Vous pouvez transmettre l'instance du contrôleur à votre méthode makeMovie, avec le paramètre withObject.

[NSThread detachNewThreadSelector:@selector(makeMovie) toTarget:movieMaker withObject:self]; 

Vous pouvez également utiliser un motif de type singleton, le cas échéant, pour extraire votre instance de contrôleur du thread.

+1

La méthode 'makeMovie' devrait être redéfinie pour accepter un paramètre (c'est-à-dire avoir la signature' -makeMovie: '). En dehors de cela, oui, cela fonctionnerait aussi. –

+0

Juste vu votre réponse. Un délégué serait plus élégant, c'est sûr, mais peut-être un peu déroutant pour un débutant:) – Macmade

+0

Je l'avais essayé mais j'avais une erreur fatale posix_spawn: 9! "erreur, et supposé que j'étais cela parce que je faisais quelque chose de mal. Mais ça marche maintenant. Merci. – whg