ios - 了解 NSRunLoop

标签 ios objective-c cocoa-touch nsrunloop

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

这样的线程
NSThread* th=[[NSThread alloc] initWithTarget:self selector:@selector(someMethod) object:nil];
[th start];

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

所以在这个线程完成他的工作之后,对吗?为什么使用 RunLoops 或在哪里使用?从Apple docs我读过一些东西,但对我来说不清楚,所以请尽可能简单地解释

最佳答案

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

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

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

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

这样做之后,它会返回到它的循环,处理来自各种来源的输入,如果没有工作可做,则“休眠”。

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

编辑

试图解决评论。我把它弄碎了。

  • it means that i can only access/run to run loop inside the thread right?

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

  • is there any simple example how to add event to run loop?

如果你想监控一个端口,你只需将该端口添加到运行循环中,然后运行循环会监视该端口的事件。

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

您还可以使用显式添加计时器

- (void)addTimer:(NSTimer *)aTimer forMode:(NSString *)mode
  • what means it will then return to its loop?

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

  • is run loop inactive when i start the thread?

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

  • is it possible to add some events to Thread run loop outside the thread?

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

  • does it mean that sometimes i can use run loop to block thread for a time

确实如此。实际上,运行循环将“停留”在事件处理程序中,直到该事件处理程序返回。您可以在任何应用程序中简单地看到这一点。为休眠的任何 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/12091212/

相关文章:

objective-c - COCOA 中的 JSON(使用 YAJL)

iphone - 钥匙串(keychain) ARC 错误

iphone - 完成编辑后如何检查 UITextField 文本是否为空

ios - 是否可以在 Alamofire 中发送带有图像的文本数据?

objective-c - 包含 .h 文件时出现重复符号

iOS:确定设备语言是否为从右到左 (RTL)

objective-c - 什么是正确的应用内购买产品类型?

iphone - 在 iPhone 中访问语音邮件

cocoa - 为什么我要制定一个全可选的消息协议(protocol)?

ios - mvvmcross ios 方法绑定(bind) (RIO)