我从这样的控制器创建一个新的线程:传递对象/线程之间的数据可可
[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:没关系。无论如何,视图通常不应该知道其控制器。即使协议只有一种方法,使用协议仍然值得把它作为委托关系。这有助于重用性和可修改性(更改此应用程序或创建新的/移植到不同的平台会更容易)。 –