谁能解释NSRunLoop是什么?所以据我所知NSRunLoop是与NSThread相关的东西,对吗?所以假设我创建一个像

NSThread* th=[[NSThread alloc] initWithTarget:self selector:@selector(someMethod) object:nil];
[th start];

-(void) someMethod
{
    NSLog(@"operation");
}

所以在这个主题完成工作后,对吗?为什么使用RunLoops或在哪里使用?从苹果文档中我读了一些东西,但对我来说还不清楚,所以请尽可能简单地解释一下

最佳答案

运行循环是一种抽象,它(除其他外)提供一种机制来处理系统输入源(套接字,端口,文件,键盘,鼠标,计时器等)。

每个NSThread都有自己的运行循环,可以通过currentRunLoop方法进行访问。

通常,您不需要直接访问运行循环,尽管有一些(网络)组件可以允许您指定它们将用于I/O处理的运行循环。

给定线程的运行循环将等待,直到其一个或多个输入源具有某些数据或事件,然后触发适当的输入处理程序来处理每个“就绪”的输入源。

这样做之后,它将返回其循环,处理来自各种来源的输入,如果没有工作要做则“ sleep ”。

这是一个相当高级的描述(试图避免过多的细节)。

编辑

尝试解决评论。我把它弄成碎片。



的确。 NSRunLoop不是线程安全的,只能从运行循环的线程的上下文中进行访问。



如果要监视端口,则只需将该端口添加到运行循环中,然后运行循环将监视该端口的 Activity 。

- (void)addPort:(NSPort *)aPort forMode:(NSString *)mode

您还可以使用以下方式显式添加计时器
- (void)addTimer:(NSTimer *)aTimer forMode:(NSString *)mode



运行循环将在每次迭代时(根据其模式)处理所有就绪事件。您将需要查看文档以发现有关运行模式的信息,因为这超出了常规答案的范围。



在大多数应用程序中,主运行循环将自动运行。但是,您有责任启动运行循环并响应所旋转线程的传入事件。



我不确定你在这里是什么意思。您不将事件添加到运行循环中。您添加输入源和计时器源(从拥有运行循环的线程中)。然后,运行循环会监视它们的 Activity 。当然,您可以提供来自其他线程和进程的数据输入,但是输入将由运行循环处理,该循环监视正在运行运行循环的线程上的那些源。



的确。实际上,运行循环将“停留”在事件处理程序中,直到该事件处理程序返回为止。您可以在任何应用程序中简单地看到它。为任何休眠的IO操作(例如,按下按钮)安装处理程序。您将阻塞主运行循环(和整个UI),直到该方法完成。

这同样适用于任何运行循环。

我建议您阅读有关运行循环的以下文档:

https://developer.apple.com/documentation/foundation/nsrunloop

以及如何在线程中使用它们:

https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html#//apple_ref/doc/uid/10000057i-CH16-SW1

10-08 12:14