在目标 C 中的单独线程上延迟方法

Posted

技术标签:

【中文标题】在目标 C 中的单独线程上延迟方法【英文标题】:Delaying a method on a separate thread in objective C 【发布时间】:2014-02-13 16:10:25 【问题描述】:

有没有办法在更改用户默认值中的键值之前延迟方法调用?

例如;我有方法 A,它是 IBAction 和方法 B。如果键“keyOne”为假;方法 A 通过-[NSUserDefaults setBool: forKey:] 将“keyOne”设置为 true,然后使用整数输入为时间延迟调用方法 B。然后方法 B 需要等待输入的延迟以秒为单位,然后使用相同的 NSUserDefaults 将“keyOne”更改回 true。

【问题讨论】:

【参考方案1】:

使用GCD 的dispatch_after() 来延迟操作。但是,不要使用 Xcode 代码 sn-p 生成的主队列,而是创建自己的队列,或者使用后台队列。

dispatch_queue_t myQueue = dispatch_queue_create("com.my.cool.new.queue", DISPATCH_QUEUE_SERIAL);

double delayInSeconds = 10.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, myQueue, ^(void)

    // Reset stuff here (this happens on a non-main thead)
    dispatch_async(dispatch_get_main_queue(), ^
        // Make UI updates here. (UI updates must be done on the main thread)
    );
);

您可以在这篇帖子的答案中找到更多关于使用performSelector:dispatch_after() 之间区别的信息:What are the tradeoffs between performSelector:withObject:afterDelay: and dispatch_after

【讨论】:

感谢您提供相关信息;正是我一直在寻找的东西。非常感谢! 现在,如果我将它添加到我的 UI 并调用我的 UI 更新方法,仍然会有延迟。【参考方案2】:

您可以使用方法 A 中的执行选择器来调用方法 B:

[self performSelector:@selector(methodName) withObject:nil afterDelay:1.0];

如果你的方法 B 需要知道你可以使用 withObject: 传递参数的延迟,它需要是 NSNumber,而不是整数。

【讨论】:

这正是我所需要的;方法 B 不需要知道它只需要发生的延迟。谢谢! @Tukajo 如果您认为此答案对您有所帮助,请将其标记为正确答案。 在一定的时间限制之后不能@Anindya Sengupta ;) Grand Central Dispatch 是更好的选择,所以另一个答案可能是您想要的。

以上是关于在目标 C 中的单独线程上延迟方法的主要内容,如果未能解决你的问题,请参考以下文章

无限循环 - 延迟 - 单独的线程

单独线程锁父中的 Java JDBC 查询

目标c线程中的线程变量生命周期

C# 计时器是不是在单独的线程上运行?

C# 中 UI 线程和子进程之间的低延迟 IPC [关闭]

确定音频处理中的延迟