【问题标题】:Objective-C class time delay?Objective-C 课程时间延迟?
【发布时间】:2009-06-29 02:30:36
【问题描述】:

我想知道是否有人知道 Objective-C 中的一个类会在运行时的指定时间内停止/延迟应用程序?我已经查看了时间管理器和 NSTimer 并且看不到我怎么可能在那里延迟。不过,我以前从未使用过这两个课程,所以也许其他人有并且可以给我小费?谢谢!

【问题讨论】:

  • 为什么您希望您的应用程序在指定的时间内冻结?或者您想延迟的不是整个应用程序、UI 等等?
  • 我只想让我的应用程序运行的 runloop 延迟几秒钟。问题是我的应用程序在循环中的某个地方挂起,我在我的 GUI 和 labelStatus.text = @"someText" 中使用了一个标签,所以我可以查明挂起的位置。
  • 我想这意味着我希望我的整个应用程序冻结几秒钟,这样运行循环中没有后台线程仍在运行,因为这可能是导致问题的原因地点。

标签: objective-c time timeout runtime


【解决方案1】:

这真的取决于您所说的“停止/延迟应用程序”是什么意思。如果您有一个单线程应用程序,您可以使用各种睡眠调用中的任何一个(usleep、sleep、nanosleep 等)。但这可能不是您想要的,因为它只会导致用户 UI 挂起,并且不会停止任何后台线程。

要真正给出一个体面的答案,可能有必要知道你实际上想要做什么。您是否在等待某事、轮询资源等?

【讨论】:

  • 实际上,我的应用程序在运行循环上运行,并且卡在某个点(我现在不知道在哪里)。我在我的 GUI 中放置了一个标签,这样我就可以在 label.text = "Application Running until Here" 之后在我的应用程序的 runloop 中放置一个时间延迟。我认为这将是准确查看我的应用挂起位置的最有效方法。
  • 你的意思是一个UILabel?我不认为那会做你想要的。所有的屏幕绘制都推迟到 runloop 执行,所以 "label.text = @"Application Running here"; sleep(3);"设置标签文本值后,屏幕更新前会暂停 3 秒。如果您的 runloop 由于某些其他原因卡住,则标签将永远不会在屏幕上更新,即使您已经设置了文本值。如果您想要实际的时间戳,请使用调试应用程序之一,或使用 NSLog 进行控制台。
  • 好吧,我同意你对 NSLog 调试的看法。如果您运行应用程序(我知道,只需输入 NSLog@"someText"),您将如何做到这一点,我之前尝试在我的应用程序中实现它,当我在模拟器上运行它时,什么都没有出现在终端。此外,我可能会遇到的问题是,我实现了一个类似于 GKTank 中的运行循环,它使用 iPod Touch/iPhone 的 P2P 蓝牙连接功能,而模拟器目前不支持该功能。那么你建议我用什么方法来解决这个问题呢?
  • 它没有显示在终端中,它如何知道将它发送到哪个 ttyy? NSLog 显示在启动它的 tty 中(在 Xcode 中,这将是 Debugger 窗口或 Console 窗口,具体取决于您在做什么。如果它不是从 shell 启动的,则 NSLog 输出将显示在系统日志文件中(/var /log/system.log)。
【解决方案2】:
#include <unistd.h>
sleep(3); // or usleep(3000000);

【讨论】:

    【解决方案3】:

    我认为您正在寻找 [NSThread sleepForTimeInterval:] 这应该可以解决问题。您还应该考虑使用计时器在延迟后调用另一个函数,因为该解决方案是非阻塞的。如果您从主线程调用 NSThread 方法,它将在时间间隔内完全锁定您的应用程序。

    【讨论】:

    • 它会锁定 UI,它不会锁定任何可能正在做事的后台线程,包括像 http loader 这样的框架线程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 2013-01-14
    • 2011-04-16
    • 2023-02-06
    • 2012-03-01
    • 1970-01-01
    相关资源
    最近更新 更多