我从控制器创建一个新线程,如下所示:
[NSThread detachNewThreadSelector:@selector(makeMovie) toTarget:movieMaker withObject:nil];
从新的thread / movieMaker对象调用控制器上的方法的最佳方法是什么?
答案 0 :(得分:2)
您可以使用makeMovie
参数将控制器实例传递给withObject
方法。
[NSThread detachNewThreadSelector:@selector(makeMovie) toTarget:movieMaker withObject:self];
如果适用,您还可以使用类似单身的模式从线程中检索控制器实例。
答案 1 :(得分: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:
方法,你就可以了。
答案 2 :(得分:1)
使用performSelectorOnMainThread:withObject:waitUntilDone:
(或类似的performSelector:...
方法),这是最简单的方法。