我分离了一个新的NSThread withObject:self,以便线程可以作为委托回调主线程。但是,我还需要新线程才能读取父级中的某些值。使用NSThread,我只能传递一个带有Object的对象,而我正在使用它来传递self,因为委托方法。我的新线程有没有办法从它的父级读取值?也许通过传递给它的自我对象?
这是我发布主题的地方:
MulticastDaemon* multicastDaemon = [[MulticastDaemon alloc] init];
[NSThread detachNewThreadSelector:@selector(doWorkWithDelegate:)
toTarget:multicastDaemon
withObject:self];
我想将一个多播IP地址和端口号传递给守护进程,所以他知道要监听什么,但我不知道如何将这些值传递给multicastDaemon。
multicastDaemon如何访问这些值?
答案 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];
否则,您必须创建守护程序可以在其委托上调用的方法,该方法收集并打包要传回的信息。在这种情况下,您可能不得不开始担心线程安全。