【发布时间】:2011-09-06 21:31:01
【问题描述】:
我从这样的控制器创建一个新线程:
[NSThread detachNewThreadSelector:@selector(makeMovie) toTarget:movieMaker withObject:nil];
从新线程/movieMaker 对象调用控制器上的方法的最佳方式是什么?
【问题讨论】:
标签: objective-c cocoa macos
我从这样的控制器创建一个新线程:
[NSThread detachNewThreadSelector:@selector(makeMovie) toTarget:movieMaker withObject:nil];
从新线程/movieMaker 对象调用控制器上的方法的最佳方式是什么?
【问题讨论】:
标签: objective-c cocoa macos
在这种情况下,您可能希望使用委托模式。在你的电影制作者类的 .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: 方法,一切顺利。
【讨论】:
您可以使用withObject 参数将控制器实例传递给您的makeMovie 方法。
[NSThread detachNewThreadSelector:@selector(makeMovie) toTarget:movieMaker withObject:self];
如果适用,您还可以使用类似单例的模式从线程中检索控制器实例。
【讨论】:
makeMovie 方法需要重新定义以接受参数(即具有签名-makeMovie:)。除此之外,是的,这也可以。
使用performSelectorOnMainThread:withObject:waitUntilDone:(或类似的performSelector:...方法),这是最简单的方法。
【讨论】: