代码之家  ›  专栏  ›  技术社区  ›  Ed Marty

如何执行选择器:withObject:afterDelay:工作?

  •  32
  • Ed Marty  · 技术社区  · 16 年前

    我目前的工作假设是 -performSelector:withObject:afterDelay:

    更具体地说:

    - (void) methodCalledByButtonClick {
      for (id obj in array) {
        [self doSomethingWithObj:obj];
      }
    }
    
    static BOOL isBad = NO;
    - (void) doSomethingWithObj:(id)obj {
      if (isBad) {
        return;
      }
      if ([obj isBad]) {
        isBad = YES;
        [self performSelector:@selector(resetIsBad) withObject:nil afterDelay:0.1];
        return;
      }
      //Do something with obj
    }
    
    - (void) resetIsBad {
      isBad = NO;
    }
    

    有保证吗 -resetIsBad 直到之后才会被呼叫 -methodCalledByButtonClick 返回,假设我们在主线程上运行,即使 -方法调用ByButtonClick

    2 回复  |  直到 16 年前
        1
  •  46
  •   Ben S    16 年前

    docs :

    这个 当前线程 使用默认值 延迟后的模式。

    讨论进一步展开:

    此方法设置一个计时器来执行 当前服务器上的aSelector消息 线程运行循环。计时器正在运行 (NSDefaultRunLoopMode)。当计时器 激发时,线程尝试退出队列 来自运行循环和 执行选择器。如果 运行循环正在运行,并且处于 等待直到运行循环处于

    由此我们可以回答你的第二个问题。 是的,有保证 performSelector 被称为。当线程返回到run循环并将选择器出列时,您将从 methodCalledByButtonClick .

        2
  •  12
  •   John    13 年前

    performSelector:withObject:afterDelay: 在同一线程上调度计时器,以便在传递的延迟之后调用选择器。如果您注册默认运行模式(即不使用 performSelector:withObject:afterDelay:inModes:

    即使您以0的延迟调用,它也会等到下一个循环,并在这里按照您的意愿进行操作。有关更多信息,请参阅 the docs .