线程中的 NSRunloop
Posted
技术标签:
【中文标题】线程中的 NSRunloop【英文标题】:NSRunloop in Thread 【发布时间】:2013-08-16 11:49:04 【问题描述】:我有问题
这里是代码
- (void)start
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate distantFuture]];
- (void)nlog
NSLog(@"cool");
- (void)main
thread = [[NSThread alloc] initWithTarget:self selector:@selector(start) object:nil];
[thread start];
[self performSelector:@selector(nlog) onThread:thread withObject:nil waitUntilDone:NO];
当我打电话时
[self performSelector:@selector(nlog) onThread:thread withObject:nil waitUntilDone:NO];
线程将继续运行,稍后我可以在线程中做一些事情;
但是如果我不调用它,线程将立即退出,并且永远无法使用线程做任何事情,为什么?
【问题讨论】:
尝试 [self performSelector:@selector(start) onThread:thread withObject:nil waitUntilDone:NO];我认为您没有在正确的线程上启动该运行循环。 @sbarow 我认为运行循环确实从辅助线程开始,如果不是,则无论是否调用 nlog,该线程都不会运行 简单的检查方法是给你的线程一个名字 [thread setName:@"MyThread"];然后在 start 和 nlog 中记录线程 NSLog("%@", [NSThread currentThread]); 【参考方案1】:当你启动一个线程时,如果你没有在runloop中添加任何source,runloop会立即返回。然后线程就结束了。
退房:
https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html#//apple_ref/doc/uid/10000057i-CH16-SW1
【讨论】:
【参考方案2】:首先,我不认为你对使用线程有正确的想法:
thread = [[NSThread alloc] initWithTarget:self selector:@selector(start) object:nil];
[thread start];
不要重写 NSThread 的 'start' 方法,你应该重写 'main' 方法。
其次,如果你想在一个线程中创建run loop,应该有一个while循环,像这样:
while (condition)
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate distantFuture]];
顺便说一句,关于 NSRunLoop 的更多详细用法请参考我的回答:Best way to make NSRunLoop wait for a flag to be set?
【讨论】:
如果你把runUntilDate:
放在一个while循环中,你应该把[NSDate distantFuture]
替换成[NSDate dateWithTimeIntervalSinceNow:1]
这样的东西
由于有时runUntilDate:
可能不会返回,因为它仍在等待下一个输入源,因此添加限制日期以保证其返回。
@Richard 我认为你是对的,我认为只需[self performSelector:@selector(nlog) onThread:thread withObject:nil waitUntilDone:NO];
做延迟时间以保证回报的工作以上是关于线程中的 NSRunloop的主要内容,如果未能解决你的问题,请参考以下文章