谁能解释NSRunLoop
是什么?所以据我所知NSRunLoop
是与NSThread
相关的东西,对吗?所以假设我创建一个像
NSThread* th=[[NSThread alloc] initWithTarget:self selector:@selector(someMethod) object:nil];
[th start];
-(void) someMethod
{
NSLog(@"operation");
}
所以在这个主题完成工作后,对吗?为什么使用
RunLoops
或在哪里使用?从Apple文档中我已经阅读了一些内容,但对我来说还不清楚,所以请尽可能简单地解释一下 最佳答案
运行循环是(除其他事项外)提供一种机制来处理系统输入源(套接字,端口,文件,键盘,鼠标,计时器等)的抽象。
每个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
关于ios - 了解NSRunLoop,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21380966/