- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
谁能解释什么是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
以及它们在线程中的使用方式:
关于ios - 了解 NSRunLoop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12091212/
崩溃发生在以下代码中: void CocoaCommRequest::launchSync() { launchAsync(); while (![_delegate finished
我的 iPhone 应用程序中有几个选项卡,需要几秒钟的时间才能加载(从本地 sqlite 数据库中提取大量数据)。当用户触摸选项卡时,应用程序似乎什么也没做。我试图放置一个显示旋转器的窗口,但是由于
我开始将 RunLoop 理解为类似于 Java 中的事件队列。我现在尝试做的 Wgat,只是为了更好地理解,是在运行自己的 RunLoop 的应用程序中创建一个后台线程。我在示例 ViewContr
我制作了一个带有计时器的 RunLoop,该计时器更新显示倒计时的标签。我需要 RunLoop 在倒计时达到零时停止,对于计时器正常完成的情况,我可以使用 runUntilDate,日期为当前日期 +
我在线程中有一个连接,因此我将其添加到运行循环中以获取所有数据: [[NSRunLoop currentRunLoop] run]; [connection scheduleInRunLoop
我有一个每 5 分钟调用一次的后台方法。 该方法使用NSURLConnection将数据发送到 Web 服务。 在那种方法中,我有这个代码: ... conn = [[NSURLConnection
我对 NSRunLoop 的实现很感兴趣,它可以在不占用大量 CPU 的情况下让线程空闲/休眠。这在 Objective-c 中是如何实现的?消耗高 CPU 的简单解决方案是 while(YES) {
在我的应用程序中,我需要对 restful web api 进行 https 调用并在返回时处理结果。同时服务调用的数量从来都不是固定的,因此相应地编写了相关代码。从服务获取的数据临时存储在应用程序内
我在自定义单元格上使用 NSTimer 运行 NSRunLoop 以持续更新“有效至”UILabel。它工作正常,直到我关闭 tableView,NSRunLoop 继续倒计时。我使用 dealloc
我不太清楚 NSRunLoop 是否线程安全。所以我需要澄清一下它是否线程安全,为什么? 任何帮助都是可观的。 最佳答案 在 NSRunLoop 的开头有一个警告 official reference
谁能解释一下什么是NSRunLoop?据我所知,NSRunLoop 是与 NSThread 相关的东西,对吗?所以假设我创建了一个像 这样的线程 NSThread* th=[[NSThread all
我刚刚在我的 ViewController 中使用 NSRunLoop 和 NSTimer 创建了一个带计时器的后台任务: - (void)runBackgroundTask: (int) time{
我读了很多关于 NSRunLoop 的帖子,比如 this , this , this .但无法弄清楚 NSRunLoop 实际上做了什么 我平时看到的是工作线程 wthread = [[NSThre
谁能解释什么是NSRunLoop?所以据我所知 NSRunLoop 是与 NSThread 相关的东西,对吗?所以假设我创建了一个像 这样的线程 NSThread* th=[[NSThread all
我试图在守护进程结束时或者有人退出该进程时释放在守护进程中分配的资源。 可以说, int main(int argc, const char * argv[]) { Controller *c
在 Cocoa 应用程序中,运行如下代码: NSDate* date = [NSDate dateWithTimeIntervalSinceNow:30.0]; while (date.timeInt
我买了《Big Nerd Ranch Guide for Objective-C》,但有一些关于 NSRunLoop 的内容我不明白。 这是书中的一段代码: NSTimer *timer = [NST
假设我有 2 个线程,一个是主线程,另一个是辅助线程。主线程使用最多,但有时(很少)我希望辅助线程根据主线程的调用执行一些工作。大多数时候辅助线程应该休眠。现在,经过一番搜索,我明白做到这一点的方法是
我正在编写一个应用程序,它必须与通过 USB 连接的设备进行通信。该应用程序按固定时间轮流从设备发送和接收数据。所有 Rx/Tx 都发生在单独的线程中,否则 UI 将被阻塞。基本结构基本上是这样的。
我正在使用 NSUrlConnection 来发出 http 请求。我想避免使用事件驱动代码,所以我通过以下方式使用 NSRunloop: NSURLRequest *request = [[NSUR
我是一名优秀的程序员,十分优秀!