让 NSRunLoop 等待设置标志的最佳方法?

2024-03-12

在苹果文档中NS运行循环 http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSRunLoop_Class/Reference/Reference.html#//apple_ref/occ/instm/NSRunLoop/run有示例代码演示了在等待其他事件设置标志时暂停执行。

BOOL shouldKeepRunning = YES;        // global
NSRunLoop *theRL = [NSRunLoop currentRunLoop];
while (shouldKeepRunning && [theRL runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]);

我一直在使用它并且它有效,但在调查性能问题时我将其追溯到这段代码。我使用几乎完全相同的代码(只是标志的名称不同:),如果我放一个NSLog在设置标志后的行上(以另一种方法),然后在设置后的行上while()两个日志语句之间有几秒钟的看似随机的等待。

在较慢或较快的机器上,延迟似乎没有什么不同,但每次运行的延迟确实不同,至少几秒,最多 10 秒。

我已经使用以下代码解决了这个问题,但原始代码不起作用似乎不正确。

NSDate *loopUntil = [NSDate dateWithTimeIntervalSinceNow:0.1];
while (webViewIsLoading && [[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate:loopUntil])
  loopUntil = [NSDate dateWithTimeIntervalSinceNow:0.1];

使用此代码,设置标志时和 while 循环之后的日志语句现在始终相隔不到 0.1 秒。

有人知道为什么原始代码会表现出这种行为吗?


运行循环有点像一个神奇的盒子,事情就会发生。

基本上你是告诉运行循环去处理一些事件然后返回。或者,如果在超时之前未处理任何事件,则返回。

如果超时时间为 0.1 秒,那么您会更频繁地遇到超时。 runloop 触发,不处理任何事件并在 0.1 秒内返回。有时它会有机会处理事件。

由于远程未来超时,运行循环将永远等待,直到处理事件。因此,当它返回给您时,它刚刚处理了某种事件。

短超时值将比无限超时消耗更多的 CPU,但是使用短超时有充分的理由,例如,如果您想终止正在运行 runloop 的进程/线程。您可能希望 runloop 注意到旗帜已经改变,需要尽快摆脱困境。

您可能想尝试一下 runloop 观察者,这样您就可以准确地看到 runloop 正在做什么。

See 这个苹果文档 https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html#//apple_ref/doc/uid/10000057i-CH16-SW22了解更多信息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

让 NSRunLoop 等待设置标志的最佳方法? 的相关文章

  • 在 OSX 和 GNU 中使用“find”删除带有数字的文件名

    我正在尝试搜索一个文件并删除名称中包含数字的类似文件 我的文件 txt from myfile 00 04 version txt myfile 00 txt find E iregex myfile 0 9 1 txt 删除 myfile
  • 如何从 iOS 应用程序检测不安全的 wifi 网络

    我想检测我的应用程序中是否存在不安全的 wifi 网络 是否有任何公共 iOS API 可以实现相同的目的 没有记录的 API 可以获取该信息 如果您的应用程序需要通过网络发送和接收敏感数据 您通常应该假设没有安全连接
  • AppDelegate 的变量用作全局变量不起作用

    我想使用我的 AppDelegate 来存储任何其他类都可以访问的对象 我已经像这样声明了这个 AppDelegate interface MyAppDelegate UIResponder
  • 如何从日期中获取小时、分钟和上午/下午? [复制]

    这个问题在这里已经有答案了 我尝试从日期中提取小时 分钟和上午 下午 但我得到 NULL 输出 我在下面显示了我的代码 请查看 NSString dateStr 29 07 2013 02 00am NSDateFormatter form
  • Xcode 4 调试器代码完成

    首先 很高兴他们尝试在 Xcode 4 中的 gdb 命令提示符上完成代码 但在当前状态下 它使得使用命令提示符来调查目标 c 对象几乎不可能 当我打字时 它自动将单词补全为我不想要的内容 并且如果不手动选择文本并将其删除 然后重新开始 则
  • 如何将 UIImageView 裁剪为自定义形状

    用户是否可以在该位周围画一条虚线 圆圈 UIImageView他们希望裁剪到 然后为UIImageView调整大小到这些点 这有点像 Photoshop 中的套索 选取框效果 更新 从 iOS 8 x 开始 UIImageView 提供了m
  • 使用 Cocoa/OSX 合并/堆叠两个图像

    我有一个 CGImageRef 我们称之为原始图像 和一个透明 png 水印 我正在尝试编写一种方法将水印放置在原始内容之上 并返回 CGImageRef 在 iOS 中 我会使用 UIKit 将它们绘制到上下文中 但这在 OSX 中似乎不
  • Objective C (iphone) 关于发布的问题

    如果我创建一个视图 并将其添加为子视图并将其添加到数组中 是否必须释放它两次 UIView cat UIView alloc initWithFrame someFrame self view addSubview cat self ani
  • 如何从 Mac OS X 中完全删除 Eclipse(包括设置和插件)?

    我的 Eclipse 与 GAE 损坏并且工作异常 所以我从Application文件夹中删除了Eclipse 但是留下了垃圾 我重新下载了全新的 eclipse 但它以旧设置运行 并且损坏的 GAE 结构仍然存在 如何从 Mac 上完全删
  • UNIX/MacOS 上静态文件的“临时 Web 服务器”?

    是否有一个像小型网络服务器这样的东西 我可以从命令行调用它 只从本地文件系统获取文件并通过特定端口上的 HTTP 为它们提供服务 我希望能够做这样的事情 cd Sites mysite serve 10 0 1 1 8080 这应该会启动一
  • UISlider不会自动重绘

    我的应用程序上有一个 UISlider 有时我不仅需要更新它的值 还需要更新它的minimumValue 值已更改 但如果我调用 setValue 方法或为滑块分配新值 它会具有新值 但滑块不会将自身重新绘制到该新值应有的位置 我怎样才能重
  • 使用自动布局、IB 和字体大小时表头视图高度错误

    我正在尝试为我的 uiTableView 创建一个标题视图 不是节标题 我已经有了 我已经在界面生成器中设置了一个 XIB 所有的连接都已连接好并且运行良好 除了桌子没有给它足够的空间 我的问题是表格顶部与表格标题有一点重叠 我的 XIB
  • 与新 Apple Music 应用程序中相同的动态状态栏

    是否可以动态着色statusBar这是在新的苹果音乐应用程序 Edit iOS 8 4 中的新 Apple Music 应用程序具有此功能 打开应用程序 选择并播放歌曲 状态栏为白色 向下滑动播放器控制器以查看 我的音乐 控制器 它有黑色状
  • VS Code 即使关闭也使用 100% CPU

    即使未打开 VS Code 也会占用 100 的 CPU 使用率 我跑了ps aux grep PID命令查看详细信息但什么也看不懂 这是输出 tawhid 27099 100 0 0 1 447352160 11856 R 7 18PM
  • 如何编辑应用程序包中的文件?

    在我的应用程序中 我从存储在捆绑资源中的 CSV 文件加载数据 但是 我希望能够在用户点击 更新 按钮时以编程方式更新此文件 有没有办法以编程方式更改应用程序包中的资源 这是我用来访问该文件的代码 NSString path NSBundl
  • 在 Mac OS X 上构建 Linux 内核

    我正在做一个修改Linux内核的项目 我有一台桌面 Linux 机器 在上面构建内核没有问题 不过 我要去旅行 我想在途中工作 我只有一台 MacBook 当我尝试构建 Linux 内核时 它抱怨说elf h was not found 我
  • 访问 google reader 的 Endpoints API 时出错

    我正在尝试在iPhone APP中实现google reader 到目前为止我已经成功收到了sid and auth 当我尝试使用以下命令调用 Endpoints API 时 问题就出现了GET 这是代码 ASIHTTPRequest re
  • 如何将CIFilter应用到UIView上?

    根据Apple docs 过滤属性CALayer不支持iOS 当我使用正在申请的应用程序之一时CIFilter to UIView即 Splice Funimate 和 Artisto 的视频编辑器 Videoshow FX 这意味着我们可
  • git Push over sshfs 失败,并显示“关闭 sha1 文件时出错:错误的文件描述符”

    我们使用 sshfs 通过 SSH 安装文件系统 并将其用作 git 存储库协作的远程存储 Mac OSX 10 6 6 到 RHEL 3 服务器 SSHFS 版本 2 2 MacFUSE SSHFS 2 2 0 MacFUSE 库版本 F
  • 子类 PFObject 上的 PFUser 属性

    我使用以下类 动态属性以及 m 文件中的 load 和 parseClassName 方法 对 PFObject 进行了子类化 interface DAOpponents PFObject

随机推荐

  • 抓取 Finviz 页面以获取表中的特定值

    首先我要说的是 我不支持抓取服务条款不允许的网站 这纯粹是为了从各个网站假设收集财务数据的学术研究 如果有人想看这个链接 存储在 URLs csv 文件中 想要抓取第 2 5 列 即 Ticker Perf Week Perf Month
  • 使用 csv 文件从元组到整数

    我在使用 csv reader 时遇到了一些问题 我有两个文件 FileA 对应 9 个地理坐标 x 第 1 列 和 y 第 2 列 没有标题 该文件从 Excel 保存到 csv 文件中 301506 5918202 301012 591
  • 防止注销后的返回操作

    注销后 如果我按浏览器中的后退按钮 它不应该显示上一页 它必须转到默认页面 仅限登录页面 所以我尝试了很多方法 Ruby on Rails应用程序 例如 history forward onbeforeunload 元标记中的过期缓存 ht
  • 使用 sed 交换两个单词

    我试图交换一行中的两个单词 但它不起作用 例如 今天是我大学的第一天 应该是 我的今天是大学的第一天 这是我尝试过的 sed s a zA z0 9 a zA z0 9 a zA z0 9 3 2 1 filename txt 我究竟做错了
  • 阻止导入的模块出现在代码完成中?

    如何防止导入的模块被访问 即堵塞我的代码完成选项 例如 testmodule py import os def o stuff return 当我导入时testmodule 我不想os每次我打字时都会出现testmodule 我只想要在 t
  • 基于寄存器的虚拟机如何工作?

    基于寄存器的虚拟机如何工作 我正在寻找有关基于寄存器的虚拟机如何工作的介绍 有人可以帮忙吗 谢谢 具有可用源代码的基于寄存器的 VM 的一个示例是Lua http www lua org 有许多资源可能会有所帮助 Lua 5 0的实现 ht
  • WPF Ribbon - 隐藏选项卡标题(单选项卡应用程序)

    我是 WPF 新手 正在尝试使用功能区控件 我的应用程序中有一个选项卡 并且希望隐藏标题但仍显示选项卡本身 我一直在尝试各种属性和样式 但我只能隐藏整个选项卡 我尝试过 ribbontab 可见性 ribbontab header 可见性
  • 无论如何,Task.Factory.StartNew 在 UI 线程上调用

    我必须处理一个奇怪的问题 至少从我的角度来看是这样 我使用任务来等待变量获取特定值 然后再次在 ui 线程上运行 继续 部分 现在的问题是 在我调用 StartNew 之前 调用内部的 ManagedThreadId 是相同的 它会冻结我的
  • 检查表达式语言中是否存在参数[重复]

    这个问题在这里已经有答案了
  • 如何使用 ObservableObject 更新 UIViewRepresentable

    我正在尝试学习与 SwiftUI 结合 并且正在努力如何更新我的视图 来自 UIKit ObservableObject 之前BindableObject 问题是 显然 方法updateUIView一旦 Published对象发送它已更改的
  • 如何知道我的 SensorManager 是否有已注册的传感器

    我正在为我的 Android 应用程序使用传感器 我用一行代码注册传感器 mySensorManager registerListener this orientationSensor SensorManager SENSOR DELAY
  • LocalNotification 与 AlarmManager 和 BroadcastReceiver 在 Android O (oreo) 中未启动

    我的本地通知在 SDK 26 之前的 Android 上运行 但在 Android O 中 我收到以下警告 并且广播接收器不会被触发 W BroadcastQueue Background execution not allowed rec
  • java.lang.NoClassDefFoundError:com/amazonaws/auth/AWSCredentials

    我正在运行适用于 AWS 的 Glacier API 这只是一个非常基本的版本 尝试列出我的保管库 我按照以下示例进行操作http docs aws amazon com amazonglacier latest dev creating
  • rshiny-将所有文件从shinyDirChoose文件夹上传到服务器

    我保存了用户定义文件夹的路径shinyDirChoose 现在我想从该用户的文件夹上传文件 但我不知道该怎么做 1 全部在服务器端 2 将文件路径提供给fileInput不知何故 这就是我构建应上传的三个文件的文件路径的方法 ui end
  • R - 顶点属性 - “set.vertex.attribute 中给出的值不合适。”

    我有一个 data frame 其中包含我想用作网络文件中的属性的值 当我尝试手动将值分配为属性时 其中一半有效 但另一半显示此错误 我仔细查看了数据 但看不出任何内在原因导致了这种情况 设置矢量输入格式 这个有效 visitgo2n v
  • 如何在android中创建图像按钮?

    所以我是android开发的新手 我怎样才能创建一个像按钮一样的图像 这样当我按下该图像时 图像就会启动特定的活动 所以我希望它显示为图像
  • 当选择的日期超出最小或最大日期时,DatePicker 会崩溃。安卓5.1

    我有这个代码 public void onDateSet DatePicker view int year int monthOfYear int dayOfMonth Log v DateRangePicker Date CHANGED
  • IIS Express Web 服务器端口正在使用

    我通常可以毫无问题地调试我的 Web 服务 但现在我不断收到错误 无法启动 IIS Express Web 服务器 端口 3268 正在使用中 我已经看过之前的问题 但我被困住了 我使用哪个端口并不重要 重新启动 关闭网络浏览器 删除网络历
  • 如何查看URL的状态?

    我创建了一个宏 可以在其中从任何网页获取每个 URL 现在 我在列中包含了每个 URL 如何检查 URL 是否有效 如果这些 URL 中的任何一个不起作用 那么它应该在下一列中的 URL 旁边显示错误 不起作用 下面是我写的代码 Sub C
  • 让 NSRunLoop 等待设置标志的最佳方法?

    在苹果文档中NS运行循环 http developer apple com documentation Cocoa Reference Foundation Classes NSRunLoop Class Reference Referen