我从 Controller 创建一个新线程,如下所示:
[NSThread detachNewThreadSelector:@selector(makeMovie) toTarget:movieMaker withObject:nil];
从新线程/movieMaker 对象调用 Controller 上的方法的最佳方法是什么?
最佳答案
在这种情况下,您可能想要使用委托(delegate)模式。在你的 movie-maker 类的 .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
然后在 Controller 的 header 中声明它支持 MovieMakerDelegate 协议(protocol),如下所示:
@interface MyController : Whatever <MovieMakerDelegate>
在您的.m中,在调用-detachNewThreadSelector:etc:
之前,调用movieMaker.delegate = self;
。在 Controller 类上实现 -movieMaker:didSomething:
方法,然后就可以开始了。
关于objective-c - 在 Cocoa 中的对象/线程之间传递数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7326418/