在Cocoa中传递对象/线程之间的数据

时间:2011-09-06 21:31:02

标签: objective-c cocoa macos

我从控制器创建一个新线程,如下所示:

[NSThread detachNewThreadSelector:@selector(makeMovie) toTarget:movieMaker withObject:nil];

从新的thread / movieMaker对象调用控制器上的方法的最佳方法是什么?

3 个答案:

答案 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:...方法),这是最简单的方法。