【问题标题】:NSTimer is not calling in background methodNSTimer 未在后台方法中调用
【发布时间】:2014-04-09 06:18:32
【问题描述】:

我陷入了一个问题。我试图在一个本身在后台的方法中运行一个计时器,导致我的计时器没有启动。我知道了一些无法在后台初始化计时器的地方,那么有什么办法可以做到这一点吗?

【问题讨论】:

  • 使用dispatch_after, NSTimer 将无法在没有NSRunloop 的背景线程中工作
  • 请详细说明我应该在我的代码中具体做什么。

标签: ios objective-c ios7 nstimer


【解决方案1】:

您可以在主线程上执行操作。

[self performSelectorOnMainThread:@selector(initTimer) withObject:nil waitUntilDone:NO];

然后

- (void)initTimer {
// Init your timer here.
}

【讨论】:

  • 定时器初始化操作应该放在initTimer方法中。
  • 不明白你的想法。
  • 您的答案是“使用主线程”,但 OP 希望通过计时器在后台线程中运行他的方法。
  • 如问题中所述,您不能在后台线程中初始化计时器。
  • @yibuyiqu 您的“initTimer”方法不会在后台线程上调用。 OP 已经尝试过了,这就是为什么问题标题是“NSTimer 没有在后台调用方法”。我不知道为什么有人赞成这个答案。
【解决方案2】:

您可以尝试在 ios7 中使用 Background Fetch 来在后台运行代码

【讨论】:

    【解决方案3】:

    试试这个:

    // provide value as required. Time here is 3 sec
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 3.0 * NSEC_PER_SEC); 
    
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        // do your task
    });
    

    【讨论】:

      【解决方案4】:

      正如@Bryan Chen 所指出的,您可以使用以下代码安排一个方法在当前线程上运行

      dispatch_time_t when = dispatch_time(DISPATCH_TIME_NOW, 0.3 * NSEC_PER_SEC);
      dispatch_after(when, dispatch_get_current_queue(), ^(void) {
          [self myTimedMethod];
      });
      

      您不能在后台线程中使用NSTimer,除非您在该线程上维护运行循环

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-14
        • 1970-01-01
        • 2012-10-21
        • 2016-05-12
        • 2016-04-02
        • 1970-01-01
        相关资源
        最近更新 更多