2011-09-06 55 views
1

我从这样的控制器创建一个新的线程:传递对象/线程之间的数据可可

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

什么是调用来自新线程/制片人对象中的控制器上的方法的最佳方法是什么?

回答

2

在这种情况下,您可能想要使用委托模式。在您的电影制造商类的.h文件中:

@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 

...并在其.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 

然后在你的控制器的头,宣布它支持MovieMakerDelegate协议,就像这样:

@interface MyController : Whatever <MovieMakerDelegate> 

并在您的m,呼唤你的-detachNewThreadSelector:etc:之前,请致电movieMaker.delegate = self;。在你的控制器类上实现-movieMaker:didSomething:方法,你很好。

+0

感谢您的回答。虽然这次我认为有一个更简单的解决方案,因为我只需要调用一种方法,但我一定会在稍后使用它。谢谢。 – whg

+1

@whg:没关系。无论如何,视图通常不应该知道其控制器。即使协议只有一种方法,使用协议仍然值得把它作为委托关系。这有助于重用性和可修改性(更改此应用程序或创建新的/移植到不同的平台会更容易)。 –

2

您可以将控制器实例传递给makeMovie方法,其中withObject参数。

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

您也可以使用类似单例模​​式(如果适用)从线程检索您的控制器实例。

+1

'makeMovie'方法需要重新定义为接受一个参数(即有'-makeMovie:'签名)。除此之外,是的,这也会起作用。 –

+0

刚看到你的答案。一个代表会更优雅,这是肯定的,但也许有点令人困惑的初学者:) – Macmade

+0

我试过这个,但我得到一个'posix_spawn致命错误:9! '错误,并假设我是这样,因为我做错了什么。但它现在起作用了。谢谢。 – whg