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

标签 objective-c cocoa macos

我从 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/

相关文章:

objective-c - Cocoa webview - html5 视频全屏不工作

macos - 使用图层支持 View 时 NSVisualEffectView 消失

c++ - 如何在 MAC OS 中使用 gethostbyname_r

c - 在 OSX 上使用 TEMP_FAILURE_RETRY

objective-c - NSTask的标准输出可以用来生成xml文件吗

ios - 当手指触摸/拖动时更改 UIButton 大小

objective-c - 如何在 tableView 中找到点击的附件按钮的 indexPath

iOS 如何使用 segue 获取对嵌入 Storyboard容器中的 View Controller 的引用?

objective-c - Apple Mach-O 框架错误

xcode - 如何在 cocoa 中制作分割窗口?