线程和 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 的相关文章

  • Xcode 5 - clang:错误:链接器命令失败,退出代码 1(使用 -v 查看调用)

    I am facing a linker error when running my source code I have attached a screenshot also I am new in iOS development and
  • iPhone OpenGL ES 工具中的 Tiler Utilization 统计数据意味着什么?

    我一直在尝试执行一些 OpenGL ES 性能优化 以提高 iPhone 应用程序中每秒渲染的三角形数量 但我遇到了困难 我尝试将 OpenGL ES 数据类型从固定点转换为浮点 每苹果的推荐 http developer apple co
  • 如何检查dispatch_async块是否已完成运行

    所以基本上我需要能够在块完成运行后运行 segue 我有一个块可以执行一些 JSON 操作 我需要知道它何时完成运行 我有一个队列 我称之为 json queue jsonQueue dispatch queue create com ja
  • iPhone 编程游戏

    使用 Objective C 还是 C 为 iPhone 编写游戏最好 像 Flight Control 这样的游戏会用什么语言编写 图形应采用什么格式才能在 iPhone 上正确显示并快速加载 像 Flight Control 这样的游戏
  • 如何在iPhone应用程序中创建折线图? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 找出窗口中的 UIBarButtonItem 框架?

    UIBarButtonItem不延长UIView 所以没有像框架属性这样的东西 但有什么办法我可以得到它是什么CGRect框架 相对于应用程序UIWindow 你喜欢用吗私有API https stackoverflow com quest
  • 仅在导航弹出后分组 UITableViewCell 上才会出现黑色角

    我不是图形专家 但我以某种方式设法通过使用一些 CG 代码将背景视图设置为 backgroundView 来制作一些好看的自定义分组 UITableViewCells 在 3 1 3 之前的所有 SDK 中 也许是 3 2 我还没有在 iP
  • 如何将 Default.png 置于横向模式?

    我有 Default png 480 320 图像 我的问题是 当我启动应用程序时 Default png 图像以横向模式显示 这怎么可能 首先 预先旋转您的初始图像 以便获得纵向和横向版本 然后 使用Default Portrait pn
  • 重用 NSURLConnection 实例

    我正在 iPhone 上使用 NSURLConnection 实例从服务器请求数据 该服务器像往常一样由委托管理 这些请求非常频繁 也许每 2 分钟一次 并且有一个共同且固定的 URL 而不是看到每次下载后释放 NSURLConnectio
  • 如何消除圆形矩形按钮周围的间隙而不删除其周围的边框? [复制]

    这个问题在这里已经有答案了 顺便提一句 这可能看起来像是关于按钮阴影问题的问题的重复 但它们有单调的背景 在我的例子中 背景是一些图像 所以简单的边框不能解决问题 While making app for iPhone Pad I noti
  • 如何在viewDidAppear中给UIView添加动画?

    我尝试向 viewDidLoad 和 viewDidAppear 添加动画 但它不起作用 void viewDidAppear BOOL animated UIView beginAnimations transition context
  • 如果以前录制并播放了电影,AVAudioRecorder 将不会录制

    我的 iPhone 应用程序使用 AVAudioRecorder 进行录音 它还使用 UIImagePickerController 来录制电影 使用 MPMoviePlayerController 来播放电影 一切正常 直到我连续完成所有
  • iPhone 操作系统测试最佳实践

    不久前 iPhone 的开发还相当简单 只有几个操作系统版本 甚至更少的设备 然而现在 有 2 个主要操作系统版本和 5 种不同的设备需要考虑 作为一家即将发布多个应用程序的公司 测试已成为越来越重要的问题 测试所有组合的最佳方法是什么 我
  • iOS 6 中捕捉全景的库 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 在iOS中有很多方法和库来显示全景图片 虽然内置相机中有全景功能 但无法在应用程序中使用它 有没有可以用来捕获全景图像的库 Thanks
  • iPhone开发-从用户位置定位地址

    是否可以使用CoreLocation框架获取用户当前所在的街道 区域 那么 如果我获取用户的经度和纬度位置 我可以从该位置获取地址 xx 街道 yy 城市 z 州 吗 Thanks 之前已经有人提出过这个问题了 刚刚发现获取纬度 经度对的街
  • 如何创建凸起的标签栏项目,就像 Instagram 中的那样?

    如何在 UITabBar 中创建凸起项目 例如 Instagram 有这样的 我如何在我的应用程序中实现类似的目标 iDevRecipes 最近发布了有关如何重新创建这一内容的文章 尽管它不是由 Instagram 的开发人员编写的 查看这
  • 当 UISwitch 改变状态时如何调用动作?

    我想在 UISwitch 更改其状态 因此设置为打开或关闭 时执行一些操作 我该怎么做呢 我需要传递两个对象作为参数 它是在代码中创建的 因此不使用 xib yourSwitchObject addTarget self action se
  • IOS 无法从 Google Drive 获取文件

    这是我的代码 GTLQueryDrive query GTLQueryDrive queryForFilesList query q NSString stringWithFormat IN parents root self driveS
  • 当应用程序从 iPhone 后台出现时,会调用什么方法?

    我知道当 iphone 应用程序进入后台时 会调用这些方法 void applicationDidEnterBackground UIApplication application void applicationWillResignAct
  • 管理 iOS 中的布局

    我是新来的iOS开发方面 我对 JAVA Swing 和 Windows 应用程序有扎实的背景 我想学习如何进行布局iOS 我猜iOS没有 布局管理器 就像 Java Swing 中的那样 发展的唯一出路UI是否指定每个控制器的尺寸和位置

随机推荐

  • 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 发生这种情况时 我会启动一个警报视图 我的结构是这样的 主线程方法分配一个新线程并初始化它 线程的入口点 方法 有一个计时器 它调用一个方法来计算剩余时间 如果时间