NSThread阅读家长的ivars?

时间:2011-11-15 15:59:31

标签: objective-c nsthread

我分离了一个新的NSThread withObject:self,以便线程可以作为委托回调主线程。但是,我还需要新线程才能读取父级中的某些值。使用NSThread,我只能传递一个带有Object的对象,而我正在使用它来传递self,因为委托方法。我的新线程有没有办法从它的父级读取值?也许通过传递给它的自我对象?

这是我发布主题的地方:

MulticastDaemon* multicastDaemon = [[MulticastDaemon alloc] init];
[NSThread detachNewThreadSelector:@selector(doWorkWithDelegate:)
                         toTarget:multicastDaemon
                       withObject:self];

我想将一个多播IP地址和端口号传递给守护进程,所以他知道要监听什么,但我不知道如何将这些值传递给multicastDaemon。

multicastDaemon如何访问这些值?

3 个答案:

答案 0 :(得分:1)

是的,您可以通过创建属性然后执行类似的操作来访问变量(您没有说出此调用的类是什么,所以我称之为MyClass):

@implementation MulticastDaemon

-(void) doWorkWithDelegate:(MyClass*) cls
{
    cls.value1 = 12;
    ...
}

...

@end

编辑:纠正了实施。

答案 1 :(得分:1)

您最好使用NSOperation的子类,然后将其添加到NSOperationQueue。您可以向该操作子类添加任何其他参数。

NSOperation还有另一个优势,就是NSThread。 NSOperation和NSOperationQueue构建在GCD之上,并且线程远比NSThread更优化。

但您也可以简单地向MulticastDaemon添加一些属性。

答案 2 :(得分:0)

您可以稍微更改MulticastDaemon的界面,以便在创建新线程之前设置委托。然后你释放withObject:插槽以传递其他内容。这样可以避免跨线程访问变量。

或者:

 MulticastDaemon* multicastDaemon = [[MulticastDaemon alloc] initWithDelegate:self];
[NSThread detachNewThreadSelector:@selector(doWorkWithInformation:)
                         toTarget:multicastDaemon
                       withObject:operatingInfo];

或者

MulticastDaemon* multicastDaemon = [[MulticastDaemon alloc] init];
[multicastDaemon setDelegate:self];

否则,您必须创建守护程序可以在其委托上调用的方法,该方法收集并打包要传回的信息。在这种情况下,您可能不得不开始担心线程安全。