我從這樣的控制器創建一個新的線程:傳遞對象/線程之間的數據可可
[NSThread detachNewThreadSelector:@selector(makeMovie) toTarget:movieMaker withObject:nil];
什麼是調用來自新線程/製片人對象中的控制器上的方法的最佳方法是什麼?
我從這樣的控制器創建一個新的線程:傳遞對象/線程之間的數據可可
[NSThread detachNewThreadSelector:@selector(makeMovie) toTarget:movieMaker withObject:nil];
什麼是調用來自新線程/製片人對象中的控制器上的方法的最佳方法是什麼?
在這種情況下,您可能想要使用委託模式。在您的電影製造商類的.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:
方法,你很好。
您可以將控制器實例傳遞給makeMovie
方法,其中withObject
參數。
[NSThread detachNewThreadSelector:@selector(makeMovie) toTarget:movieMaker withObject:self];
您也可以使用類似單例模式(如果適用)從線程檢索您的控制器實例。
使用performSelectorOnMainThread:withObject:waitUntilDone:
(或類似的performSelector:...
方法),它是最簡單的方法。
感謝您的回答。雖然這次我認爲有一個更簡單的解決方案,因爲我只需要調用一種方法,但我一定會在稍後使用它。謝謝。 – whg
@whg:沒關係。無論如何,視圖通常不應該知道其控制器。即使協議只有一種方法,使用協議仍然值得把它作爲委託關係。這有助於重用性和可修改性(更改此應用程序或創建新的/移植到不同的平臺會更容易)。 –