首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >了解NSRunLoop

了解NSRunLoop
EN

Stack Overflow用户
提问于 2012-08-23 20:07:15
回答 4查看 69.7K关注 0票数 120

谁能解释一下什么是NSRunLoop?据我所知,NSRunLoop是和NSThread有关的东西,对吧?所以假设我创建了一个线程,如下所示

代码语言:javascript
复制
NSThread* th=[[NSThread alloc] initWithTarget:self selector:@selector(someMethod) object:nil];
[th start];

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

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-08-23 21:00:33

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

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

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

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

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

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

编辑

尝试处理该评论。我把它打碎了。

  • 这意味着我只能访问/运行线程内部的运行循环,对吧?

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

  • 有没有简单的例子如何添加事件到运行循环?

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

代码语言:javascript
复制
- (void)addPort:(NSPort *)aPort forMode:(NSString *)mode

也可以使用显式添加计时器

代码语言:javascript
复制
- (void)addTimer:(NSTimer *)aTimer forMode:(NSString *)mode

  • 然后返回到循环是什么意思?

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

当我启动线程时,

  • 的运行循环处于非活动状态?

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

  • 是否可以将一些事件添加到线程外部的线程运行循环中?

我不知道你在这是什么意思。您不需要向run循环中添加事件。添加输入源和计时器源(来自拥有run循环的线程)。然后,run循环监视它们的活动。当然,您可以提供来自其他线程和进程的数据输入,但输入将由run循环处理,该循环在运行run循环的线程上监视这些源。

  • 是否意味着有时我可以使用run循环在time

中阻塞线程

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

这同样适用于任何run循环。

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

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

票数 221
EN

Stack Overflow用户

发布于 2014-10-14 17:30:55

RunLoops有点像一个盒子,里面只会发生一些事情。

基本上,在RunLoop中,您需要处理一些事件,然后返回。或者,如果在超时之前没有处理任何事件,则返回。你可以说它类似于异步NSURLConnections,在后台处理数据而不会干扰当前的循环,但同时,你需要同步数据。这可以在RunLoop的帮助下完成,它可以创建异步NSURLConnection并在调用时提供数据。您可以像这样使用RunLoop:

代码语言:javascript
复制
NSDate *loopUntil = [NSDate dateWithTimeIntervalSinceNow:0.1];

while (YourBoolFlag && [[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate:loopUntil]) {
    loopUntil = [NSDate dateWithTimeIntervalSinceNow:0.1];
}

在此RunLoop中,它将一直运行,直到您完成某些其他工作并将YourBoolFlag设置为false

类似地,您可以在线程中使用它们。

希望这对你有帮助。

票数 8
EN

Stack Overflow用户

发布于 2018-04-25 09:50:27

运行循环是与线程相关的基础设施的一部分。运行循环是一个事件处理循环,用于安排工作并协调传入事件的接收。运行循环的目的是让线程在有工作要做时保持忙碌,在没有工作时让线程进入睡眠状态。

From here

CFRunLoop最重要的特性是CFRunLoopModes。CFRunLoop使用的是“运行循环源代码”系统。在一个或多个模式的run循环上注册源代码,并使run循环本身在给定的模式下运行。当事件到达源时,如果源模式与运行环路电流模式匹配,则仅由运行环路处理。

From here

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12091212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档