2011-09-06 35 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