谁能解释一下什么是NSRunLoop?据我所知,NSRunLoop是和NSThread有关的东西,对吧?所以假设我创建了一个线程,如下所示
NSThread* th=[[NSThread alloc] initWithTarget:self selector:@selector(someMethod) object:nil];
[th start];
-(void) someMethod
{
NSLog(@"operation");
}那么在这之后Thread完成了他的工作,对吗?为什么使用RunLoops或在哪里使用?从苹果文档中我读到了一些东西,但对我来说不太清楚,所以请尽可能简单地解释
发布于 2012-08-23 21:00:33
运行循环是一种抽象,提供了一种机制来处理系统输入源(套接字、端口、文件、键盘、鼠标、计时器等)。
每个NSThread都有自己的运行循环,可以通过currentRunLoop方法访问。
通常,您不需要直接访问运行循环,尽管有一些(网络)组件可能允许您指定它们将使用哪个运行循环进行I/O处理。
给定线程的run循环将等待,直到它的一个或多个输入源具有某些数据或事件,然后触发适当的输入处理程序来处理每个“就绪”的输入源。
这样做之后,它将返回到它的循环,处理来自各种来源的输入,如果没有工作要做,就“休眠”。
这是一个相当高层次的描述(试图避免太多细节)。
编辑
尝试处理该评论。我把它打碎了。
确实如此。NSRunLoop不是线程安全的,只能从运行循环的线程的上下文中访问。
如果要监视端口,只需将该端口添加到运行循环中,然后运行循环将监视该端口的活动。
- (void)addPort:(NSPort *)aPort forMode:(NSString *)mode也可以使用显式添加计时器
- (void)addTimer:(NSTimer *)aTimer forMode:(NSString *)moderun循环将在每次迭代中处理所有就绪事件(根据其模式)。您需要查看文档来了解运行模式,因为这有点超出了一般答案的范围。
当我启动线程时,
在大多数应用程序中,主运行循环将自动运行。但是,您要负责启动run循环并响应您旋转的线程的传入事件。
我不知道你在这是什么意思。您不需要向run循环中添加事件。添加输入源和计时器源(来自拥有run循环的线程)。然后,run循环监视它们的活动。当然,您可以提供来自其他线程和进程的数据输入,但输入将由run循环处理,该循环在运行run循环的线程上监视这些源。
中阻塞线程
确实如此。事实上,运行循环将“停留”在事件处理程序中,直到该事件处理程序返回为止。你可以在任何应用程序中看到这一点。为休眠的任何IO操作(例如按钮按下)安装一个处理程序。您将阻塞主运行循环(以及整个UI),直到该方法完成为止。
这同样适用于任何run循环。
我建议您阅读以下有关run循环的文档:
https://developer.apple.com/documentation/foundation/nsrunloop
以及如何在线程中使用它们:
发布于 2014-10-14 17:30:55
RunLoops有点像一个盒子,里面只会发生一些事情。
基本上,在RunLoop中,您需要处理一些事件,然后返回。或者,如果在超时之前没有处理任何事件,则返回。你可以说它类似于异步NSURLConnections,在后台处理数据而不会干扰当前的循环,但同时,你需要同步数据。这可以在RunLoop的帮助下完成,它可以创建异步NSURLConnection并在调用时提供数据。您可以像这样使用RunLoop:
NSDate *loopUntil = [NSDate dateWithTimeIntervalSinceNow:0.1];
while (YourBoolFlag && [[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate:loopUntil]) {
loopUntil = [NSDate dateWithTimeIntervalSinceNow:0.1];
}在此RunLoop中,它将一直运行,直到您完成某些其他工作并将YourBoolFlag设置为false。
类似地,您可以在线程中使用它们。
希望这对你有帮助。
https://stackoverflow.com/questions/12091212
复制相似问题