iPhone 4 有没有绝对确定的方法可以让 NSTimer 长期火起来

2023-12-13

我的 NSTimers 和后台选择器一直遇到问题。这让我抓狂,并且需要很长时间来尝试每一个调整。为了保持我的理智以及未来几代可可程序员的理智,我问这个问题:

是否有绝对 100% 确定的方法可以在稍后的时间点触发预定的长期计时器,无论它是否是从后台线程、主线程等调用的?

对于大多数使用 NSTimers 的类,我似乎不得不一遍又一遍地解决同样的问题。它们在短期测试期间工作,假设我将计时器设置为通过后台线程在 10 秒内触发。它有效,因为仍然有一个运行循环在运行。但一旦我将点火时间更改为我真正想要的时间(例如 15-30 分钟),就会一片死寂。运行循环消失了,我不知道如何处理这种情况。什么也没发生,几天后我发现了这样的错误,一旦我已经忘记了哪个计时器会对此负责。

目前我正在与选择器做一些非常非常丑陋的舞蹈,例如这里有一个测试方法(它似乎适用于 10 分钟计时器):

//this is a test method to simulate a background task requesting a timer
  [self performSelectorInBackground:@selector(backgroundReminderLongTermTest:) withObject:nil];

//this is a method similar to the one that the background thread would be trying to invoke
    -(void)backgroundReminderLongTermTest:(id)sender
    {
        [self performSelectorOnMainThread:@selector(backgroundReminderFromMainThread:) withObject:nil waitUntilDone:NO];
    }

//this is a wrapper for the background method, I want the timer to be added to a thread with a run loop already established and running
    -(void)backgroundReminderFromMainThread:(id)sender
    {
            [playTimers addObject:[NSTimer scheduledTimerWithTimeInterval:1800 target:self selector:@selector(start:) userInfo:nil repeats:NO]];

    }

我喜欢这样的便利,不必担心使用预定的计时器创建触发日期对象,但我是否应该忘记它们并使用具有特定触发日期的计时器?当运行循环已经存在时,scheduledTimer 似乎适用于短期任务,但我在应用程序执行期间根本看不到这种错误。在某个时刻,计时器似乎正常触发,但在稍后的某个时刻,它们完全停止触发。

感谢您的任何帮助或澄清。我正在寻找一种安排计时器的方法,而不必担心每次需要安排计时器时是否存在运行循环。我想确保只要应用程序正在运行,通过此方法安排的计时器就会在未来的可预测点触发。


NSTimers 的众多问题之一是它们的运行循环依赖性。每个线程都有一个运行循环。如果您在后台线程上安排计时器,它将被安排在该线程的运行循环上。如果该线程的生命周期很短(后台线程通常是这样),则该计时器将随之悄然消亡。

解决方案是保证计时器在一个线程上运行will当计时器触发时还活着。根据我的经验,执行这些专用后台计时器的最佳方法是根本不使用 NSTimer,而使用 GCD 计时器。比我更好的人已经编写了 GCD 驱动的计时器。我个人比较喜欢迈克·阿什的文章和实现,并附有解释。

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

iPhone 4 有没有绝对确定的方法可以让 NSTimer 长期火起来 的相关文章

  • Objective-C 相当于 Java 枚举或“静态最终”对象

    我试图找到一个与 Java 枚举类型或 public static final 对象等效的 Objective C 例如 public enum MyEnum private String str private int val FOO f
  • Three20 和 iOS 6 不工作

    我刚刚尝试了我的一个项目 其中包含 Three20 但它似乎无法编译 给我构建错误 似乎是因为一些 UITouch 界面发生了变化 想知道是否有快速修复方法可以做到这一点 看来问题是在这里 UITouch ivars 已从 iOS 6 SD
  • 转换任何对象?到字符串

    我有一个返回 AnyObject 的函数 func aFunction param String gt AnyObject 如何将其转换为字符串 和字符串 尝试这个 if let result aFunction test as Strin
  • 从电话号码确定国际电话代码的算法

    我可以使用 iOS 上的地址簿框架从设备中检索联系人的电话号码 如何区分或识别哪个是国家 地区代码 哪个是实际电话号码 是否可以 国家 地区代码是一个相当混乱的主题 但足够标准 通过一些程序员维护就可以解决它 您可以通过其初始子序列来识别国
  • 新的自动引用计数机制如何工作?

    有人可以简单地向我解释一下 ARC 的工作原理吗 我知道它与垃圾收集不同 但我只是想知道它到底是如何工作的 另外 如果 ARC 的作用与 GC 的作用相同且不影响性能 那么 Java 为什么要使用 GC 为什么它不使用 ARC 呢 每个接触
  • Ruby MRI 1.8.7 - 文件写入线程安全

    在我看来 在 Ruby MRI 1 8 7 中写入文件是完全线程安全的 示例 1 完美的结果 File open test txt a f threads 1 000 000 times do n threads lt lt Thread
  • 最好使用的游戏/物理引擎?

    寻找用于移动游戏开发的游戏 物理引擎 iPhone 有Cocos2D http www cocos2d iphone org 我找到的安卓系统RokonAndroid http rokonandroid com 只是想知道是否还有其他人知道
  • iOS 版 Google 地图 SDK 中的热图

    有没有办法添加热图图层适用于 iOS 的 Google 地图 SDK https developers google com maps documentation ios 注意 我指的是存在于Javascript 版本的 Google 地图
  • 如何在 iOS 中以编程方式在 UITableViewCells 中添加图像

    我需要添加不同的图像UITableViewCells以编程方式 我怎样才能做到这一点 我正在尝试一些代码 但图像不显示在UITableViewCells 这是我下面的代码 void viewDidLoad arrImages NSMutab
  • 当应用程序从 iPhone 后台出现时,会调用什么方法?

    我知道当 iphone 应用程序进入后台时 会调用这些方法 void applicationDidEnterBackground UIApplication application void applicationWillResignAct
  • “找不到开发者磁盘映像”

    最近我收到错误 找不到开发人员磁盘映像 我认为自从我将 iPhone 上的 iOS 更新到 9 1 后就会发生这种情况 如何解决该问题并使 Xcode 支持 iOS 9 1 设 备 Xcode 7 0 1 和 iOS 9 1 不兼容 您需要
  • 我可以在 UITextView 中以编程方式选择文本吗?

    我想在 UITextView 上选择文本 类似于我们点击时看到的默认 选择 和 全选 弹出选项 我希望用户能够从我的自定义菜单中执行此操作 我玩了 selectedRange 但这似乎并没有解决问题 有任何想法吗 Thanks The se
  • 从iOS iphone中相机返回的图像中读取GPS数据

    我需要获取使用 iOS 设备相机拍摄的图像的 GPS 坐标 我不关心相机胶卷图像 只关心使用 UIImagePickerController SourceType Camera 拍摄的图像 我读过很多 stackoverflow 答案 比如
  • 在 Cordova / PhoneGap 中生成 iOS 和 Android 图标

    我有一个新创建的 Cordova 项目 其中包含以下内容config xml设置 使用来自http docs phonegap com en edge config ref images md html http docs phonegap
  • Xamarin Form - IOS:如何检测 UIView 大小已更改

    我使用 ContentView 创建了一个 Xamarin 表单 并为 Android 创建了一个渲染器 现在我必须为 IOS 创建一个渲染器 在 android 渲染器中 我可以重写 onSizeChanged 并将这些宽度 高度值传递给
  • 使用 Xcode 6 XLIFF 导出的 iOS 本地化/国际化设置 Bungle

    背景 Xcode 6 添加了快速导出功能 可为每种语言创建单个 XLIFF 文件 只需从文件导航器中选择您的项目 然后选择菜单项编辑器 导出以进行本地化 Issue 它工作得非常好 并且 XML 中包含了所有内容 除了设置捆绑字符串 有人有
  • python 的 fcntl.flock 函数是否提供文件访问的线程级锁定?

    Python 的 fcnt 模块提供了一种名为 flock 1 的方法来证明文件锁定 其描述如下 对文件执行锁定操作op 描述符 fd 文件对象提供 fileno 方法被接受为 出色地 请参阅 Unix 手册集群 2 了解详情 在某些系统上
  • 苹果拒绝任何访问UDID的应用程序,不支持Retina、iPhone 5显示屏?

    得到消息来自TNW http thenextweb com apple 2013 03 21 after a year of warnings apple will no longer accept any apps that use ud
  • UIPopViewController 不工作

    我有一个 xib 文件 其中有 h 和 m 链接 在 xib 中有一个带有 textView 的 UIView 我想要对该视图执行的操作是 当您单击按钮时将其作为 UIPopViewController 打开 这是我的代码 IBAction
  • 类型铸造自我

    以下自我转换对 ClassA 有何作用 这种种姓可以让你进入ClassA吗 A h类 interface ClassA NSObject NSUInteger someNumber ClassB classB property nonato

随机推荐