线程和 NSTimer

2023-12-19

我正在制作一个带有计时器的应用程序。我从给定时间开始计算分钟和秒,直到 0。发生这种情况时,我会启动一个警报视图。

我的结构是这样的:

主线程方法分配一个新线程并初始化它。 线程的入口点(方法)有一个计时器,它调用一个方法来计算剩余时间,如果时间到了,则显示一个警报视图。

然而,这是正确的吗?因为现在我正在从主线程之外的另一个线程更新 GUI...这很糟糕,对吧?我还显示了该线程的警报视图。

我想制作另一种方法来封装用于更新和显示警报视图的所有逻辑,并在 nstimer 调用的方法中使用performSelectorInMainThread,但这是否正确?

谢谢你的时间。


假设确定剩余时间相当简单,只需在主线程上运行计时器即可。计时器附加到当前的运行循环,因此它不会在任何地方阻塞,并且其回调方法不应花费过多的时间来运行,因此可以很好地更新 UI。

- (void) initializeTimerWithEndTime: (NSDate *) endTime
{
    // call this on the main thread & it'll automatically
    // install the timer on the main runloop for you
    self.countdownTimer = [NSTimer scheduledTimerWithTimeInterval: 1.0
                                                           target: self
                                                         selector: @selector(timerTick:)
                                                         userInfo: endTime
                                                          repeats: YES];
#if __TARGET_OS_IPHONE__
    // fire while tracking touches
    [[NSRunLoop mainRunLoop] addTimer: self.countdownTimer
                              forMode: UITrackingRunLoopMode];
#else
    // fire while tracking mouse events
    [[NSRunLoop mainRunLoop] addTimer: self.countdownTimer
                              forMode: NSEventTrackingRunLoopMode];
    // fire while showing application-modal panels/alerts
    [[NSRunLoop mainRunLoop] addTimer: self.countdownTimer
                              forMode: NSModalPanelRunLoopMode];
#endif
}

- (void) cancelCountdown
{
    [self.countdownTimer invalidate];
    self.countdownTimer = nil;
}

- (void) timerTick: (NSTimer *) aTimer
{
    NSDate * endDate = [timer userInfo];
    NSDate * now = [NSDate date];

    // have we passed the end date?
    if ( [endDate laterDate: now] == now )
    {
        // show alert
        [self cancelCountdown];
        return;
    }

    // otherwise, compute units & show those
    NSUInteger units = NSHourCalendarUnit|NSMinuteCalendarUnit|NSSecondCalendarUnit;

    NSDateComponents * comps = [[NSCalendar currentCalendar] components: units
                                                               fromDate: [NSDate date]
                                                                 toDate: endDate
                                                                options: 0];
    [self.clockView setHours: comps.hour
                     minutes: comps.minute
                     seconds: comps.second];
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

线程和 NSTimer 的相关文章

  • iOS - 自动调整 CVPixelBufferRef 的大小

    我正在尝试裁剪和缩放CMSampleBufferRef基于用户的输入 基于ratio 下面的代码采用 CMSampleBufferRef 将其转换为 CVImageBufferRef 并使用 CVPixelBuffer 根据其字节裁剪内部图
  • 如何降低iphone的sdk Audioqueue的声音?

    我正在使用 Aran Mulhollan 的 RemoteIOPlayer 在 SDK iphone 中使用音频队列 我可以毫无问题 添加两个信号来混合声音 通过乘以从 wav 文件中获得的 UInt32 来增加音量 但所有其他操作都会给我
  • UILocalizedIndexedCollat​​ion的sectionForObject:(id)object collat​​ionStringSelector:(SEL)selector方法中selector的作用是什么

    我是 iOS 开发的初学者 正在经历this https developer apple com library ios documentation UserExperience Conceptual TableView iPhone Cr
  • 我如何知道网页视图已加载完成

    我有网络视图 因为我正在加载pdf文件 pdf 文件大小为 2 mb 因此需要时间 我想添加指标 为此 我如何知道我的文件已加载到网络视图中 UIWebView 委托 http developer apple com library ios
  • 当用户到达 UITableView 的最后一行时,如何动态添加行?

    我有一个UITableview当前显示 10 行 固定为静态 现在我想在其中添加一个功能 当用户到达最后一行时 我想向表中添加更多 10 行UITableView 我的意思是目前我在应用程序中显示固定的 10 行 但现在我想在用户到达上一个
  • 如何在 iOS 中查找蓝牙音频设备

    好的 我正在开发一个有趣的项目 该项目有一个障碍 我需要为我的 iOS 应用程序启用蓝牙音频支持 我遇到的障碍是我什至无法开始获取已连接的蓝牙音频设备的列表 即使我的 iPhone 5S 可以识别我的耳机 大约 3 4 岁的耳机 LG HB
  • 如何建立辅助NSSortDescriptor排序键?

    我已成功按排序键对数据进行排序lastName 但我想知道如何排序lastName 然后由firstName 这是我用来排序的代码lastName NSSortDescriptor sortDescriptor NSSortDescript
  • 滑动删除不起作用

    滑动删除功能在我的表格视图中不起作用 我已经在导航栏中实现了 commitEditingStyle 委托和编辑按钮 因此 当用户单击编辑按钮时 删除和添加按钮会相应显示 但是 在滑动时 删除按钮不会出现 并且似乎它无法将滑动识别为对 set
  • Objective-C:在哪里定义宏以便随处可用?

    我有一个 iOS 应用程序 它在许多视图控制器中使用相同的字符串 数字等 所以我认为最好在一个文件中定义这些常量并在所有视图控制器实现中使用它 优点是更改一个数字 我只需要做一次 而不是在所有视图控制器中都使用该数字 实际上 我的 h 文件
  • NSDictionary 上的 NSPredicate

    我试图根据字母表在表格视图中创建部分 并在这些部分下按字母顺序对我的条目进行排序 我已经收集了 bandArrayIndex 中 bandArray 每个条目的第一个字母 现在我尝试使用 NSPredicate 来计算每个字母有多少个 我正
  • iPad 照片选择器崩溃

    我正在使用以下函数根据 UIActionSheet 的结果激活设备相机或图像选择器 如果 fromCamera YES 那么它适用于 iPhone 和 iPad 如果 fromCamera NO 那么它可以在 iPhone 上运行并出现图像
  • 是否有针对不同屏幕尺寸的单独故事板?

    基本上我已经完成了一个应用程序 我唯一的问题是 ATM 机应用程序在设计时只考虑了 4 英寸显示屏 当在 3 5 英寸模拟器上运行时 应用程序会丢失 0 5 英寸 显然 那么我的问题是 如何在 Xcode 5 中为不同的屏幕尺寸设置不同的故
  • 从 UIImagePickerController 相机视图推送 viewController

    我正在开发一款消息应用程序 类似于 WhatsApp 用户可以互相发送文本和图像消息 当用户想要发送图像时 他可以从相机胶卷中选择一张图像 也可以用相机拍摄一张图像 这就是我介绍的方式UIImagePickerController对于这两种
  • iPhone 应用程序中的异步、同步、线程

    我正处于一个应用程序的设计阶段 该应用程序将利用 REST Web 服务 并且在使用异步 同步和线程方面遇到了困境 这是场景 假设您有三个选项可供深入研究 每个选项都有自己的基于 REST 的资源 我可以使用同步请求延迟加载每个请求 但这会
  • 如何替换已弃用的方法dispatch_get_current_queue()? [复制]

    这个问题在这里已经有答案了 我正在 iOS 5 中使用 xmppframework 开发一个聊天应用程序 它工作得很好 但我将 Xcode 更新到 4 5 1 将 iOS 5 更新到 iOS 6 将 Mac OS 更新到 10 7 5 但由
  • XCode 无法将 iPhone 应用程序部署到 iPhone 3GS

    因此 我构建了我的 iPhone 应用程序 它在模拟器中运行良好 因此我想将其部署到我的 iPhone 上进行最后一轮测试 然后再使用我的分发配置文件进行公开 Beta 测试 我已经这样做过很多次了 从来没有出现过问题 然而 自从上次测试运
  • iPhone 的电子书框架

    我有一本书想作为 iPhone 应用程序发布 有谁知道我可以使用免费 或便宜 的框架来实现这一目标 换句话说 我想为我的书创建一个独立的 XCODE 项目 其中包含 iPhone 用户将本书作为独立应用程序阅读所需的所有代码 我见过 O R
  • 在 XCode 中链接静态 ObjC 库的过程

    我正在尝试链接到静态库 但不断收到链接器错误 我发现了一些发布示例的网站 但我无法看到我做错了什么 首先 我创建一个链接到我的库的项目 添加 gt 现有文件找到我的 xcodeproj 文件选择 将项目复制到目标组文件夹 选择我的宿主项目作
  • 虚拟乐器 iPhone 应用程序中的 VoiceOver 辅助功能?

    我收到盲人用户的评论 称我的一些声音和音乐相关应用程序只能在关闭 VoiceOver 的情况下使用 在 iOS 设备上启用 VoiceOver 辅助功能后 是否可以启用音乐键盘或鼓垫触摸区域 以便在点击键盘键或虚拟鼓组 等 时可以立即播放音
  • UIView晃动动画

    我试图在按下按钮时使 UIView 摇动 我正在调整我找到的代码http www cimgf com 2008 02 27 core animation tutorial window shake effect http www cimgf

随机推荐

  • Python:解析带有嵌入图像的电子邮件

    我正在开发一个使用 python POP3 库连接到邮件服务器的应用程序 解析电子邮件并将它们放入数据库中 我已成功解析文本电子邮件 html 电子邮件和附件 现在 我被那些包含嵌入图像的电子邮件所困扰 服务器正在处理 CID src 标记
  • SPListItem.Properties 日期时间字段采用奇怪的十六进制格式

    有谁知道如何将这些字符串十六进制值转换回日期时间值 属性 my DateProperty System String 0x01c9874e 0x98f28800 l item is SPListItem Hashtable l proper
  • 为什么这是一个贪心算法?

    我的课本上有这样一个问题 假设我们有一组活动要在大型活动中安排 报告厅的数量 任何活动都可以在任何报告厅进行 我们希望利用尽可能少的报告厅来安排所有活动 给出一个有效的贪心算法来确定哪个活动应该使用哪个演讲厅 答案在这里给出 http mi
  • 如何正确使用NuGet进行团队开发?

    因此 我想使用 NuGet 来管理我和我的团队正在从事的特定项目所使用的各种项目 到目前为止 我已将 js 库文件放置在 Web 解决方案 ASP NET MVC 2 的 Scripts 目录中并引用了这些文件 当然 这是手动的 并且在升级
  • 从具有两种类型的对象的列表中获取 ComboBox 选定值,并且组合框仅显示其中一种

    我正在 Windows 窗体中构建 C 应用程序 我有一个车辆类和两个派生类汽车和摩托车 然后我将车辆保存到列表中 现在我有一个表格 我只想显示汽车或摩托车 在主窗体中 有一个按钮 显示汽车 和另一个按钮 显示摩托车 它们将告诉另一个窗体要
  • “内置方法 numpy.core._multiarray_umath.implement_array_function” 是性能瓶颈吗?

    我在用着numpy v1 18 2在一些模拟中 并使用内置函数 例如np unique np diff and np interp 我在标准对象 即列表或 numpy 数组 上使用这些函数 当我检查时cProfile 我看到这些函数调用了一
  • Eurekalog:将异常堆栈跟踪保存到日志文件中

    我使用的是delphi 7 我需要记录到文件任何的完整信息例外发生这种情况 通常我使用 Eurekalog 这个精彩的产品显示了一个包含所有堆栈跟踪信息和许多其他用于调试目的的对话框 我需要访问尤里卡日志给我的这些信息 实际上我只需要堆栈跟
  • 如何强制 Visual Studio 2013 中的项目始终以管理员身份运行?

    我在 Visual Studio 2013 中有一个 WPF 项目 该项目有两个按钮 第一个按钮表示 启动服务 第二个按钮表示 停止服务 当我以管理员身份运行 Visual Studio 时 这些按钮可以工作 但是 当我在没有权限的情况下打
  • 通过 wifi 从其他计算机访问私有虚拟机

    我有一个专用网络虚拟机用于在我的 Mac 上进行开发 我希望我的 Android 设备能够与我的 Mac 上的虚拟机进行通信 目前 我可以在我的 Mac 上访问我的 Vagrantfile 中定义的 IP 10 10 10 10 并且访问它
  • 有没有办法使用三元运算符 - 或类似的方法 - 来选择要分配的变量?

    是否可以根据条件改变我分配给的变量 我遇到的问题是想要这样做 bEquipAsSecondary currentWeaponOffhand currentWeaponMainhand weaponToSwitchTo 代替 if bEqui
  • node.js process.stdout.write 类型错误

    我正在开发一个简单的函数来在 node js 中创建基于控制台的提示 而无需使用一堆额外的库 function prompt text callback Text can be a question or statement use str
  • 如何克隆所选插件的选择元素

    我使用 jQuery 选择插件 在这里找到 http harvesthq github com chosen http harvesthq github com chosen 它添加了额外的功能来选择 HTML 元素 我想克隆一个包含 se
  • Python:请求无法登录网站

    我需要抓取需要登录的网站 我正在尝试创建一个session并登录 因为登录后我必须抓取不同的页面 但无法找出它不起作用的原因 import requests from bs4 import BeautifulSoup login data
  • 在 Excel 中使用 IF() 和 TIMEVALUE()

    我有以下公式 IF TIMEVALUE 14 30 TIMEVALUE NOW lt TIMEVALUE 00 00 Past Future Excel 给我错误 我单独检查了所有公式 它们都给了我时间值 理论上应该足以与 IF 语句进行比
  • 两台服务器之间的远程 rsync 管道损坏

    我正在尝试在 ubuntu 16 04 上使用 bash 将大型数据集 768 Gigs 从一台远程计算机传输到另一台远程计算机 我遇到的问题是 我使用 rsync 机器将传输几个小时 然后在连接不可避免地中断时退出 假设我在机器 A 上
  • s3 预签名 url 多部分表单数据上传错误:签名不匹配

    我从 aws 获取一个预签名的 url 并使用它来请求 PUT 一个 zip 文件 我得到签名不匹配 获取预签名 url 时 const params Bucket myBucket Key myKey Expires 60 60 ACL
  • 如何在javascript中对角遍历数组[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我有一个包含字符串的数组 我想对角遍历它 假设 每个字符串的长度相同 阵列可以是正方形或矩形 水平或垂直的 矩阵如下所示
  • 将 str 分数转换为 pandas df 中的浮点数

    我有一个非常尴尬的 pandas DataFrame 看起来像这样 identifier per 1 per 2 per 3 per 4 per 5 something 124 127 100 100 24 39 14 20 10 10 c
  • 固定标题 jQuery Mobile

    是否有可能获得固定标题 jQuery Mobile 并在顶部设置一行 如下面的链接所示 http www expedia com au p promos Beach Breaks htm http www expedia com au p
  • 线程和 NSTimer

    我正在制作一个带有计时器的应用程序 我从给定时间开始计算分钟和秒 直到 0 发生这种情况时 我会启动一个警报视图 我的结构是这样的 主线程方法分配一个新线程并初始化它 线程的入口点 方法 有一个计时器 它调用一个方法来计算剩余时间 如果时间