【问题标题】:A way to schedule a method call in Cocoa?一种在 Cocoa 中安排方法调用的方法?
【发布时间】:2013-06-17 11:56:23
【问题描述】:

我想调用一个方法

-(void) fooWithObject:(MyObject *)obj;

在给定时间(NSDate 实例)

不阻塞主线程。

解决此问题的最佳方法是什么?我见过NSTimerperformSelectorNSOperation,但读了一些让我更加困惑。

重要:

  • 能够将对象传递给我正在调用的方法
  • 一种设置执行时间的方法
  • 非阻塞
  • 不需要重复

干杯!

【问题讨论】:

    标签: macos cocoa nsdate nstimer background-process


    【解决方案1】:

    performSelector:withObject:afterDelay 可以用于此。延迟是相对的,因此您需要计算所需日期和当前时间之间的差异。像这样的东西(直接在 iPad 上输入答案 - E&OE):

    - (void) fooWithObject:(MyObject *)obj onDate:(NSDate *)onDate
    {
        [self performSelector:@selector(fooWithObject:)
                   withObject:obj
                   afterDelay:MAX(0, [onDate timeIntervalSinceNow])
        ];
    }
    

    请注意,如果传入的日期是过去的,则使用 MAX - 延迟将为 0,因此将“尽快”执行选择器。

    【讨论】:

    • 值得注意的是,这种方法不是毫秒级的。您可能不想将它用于起搏器之类的用途。
    • @Chuck 是正确的。在后台performSelector:withObject:afterDelay 使用计时器并且与NSTimer 一样(不)精确。但说真的,我不会将(香草)Objective-C 用于任何对安全至关重要的东西,而不仅仅是起搏器! ;-)
    • @SamJarman - 不。选择器在执行时将在主线程上执行,如果这是一个问题,则有一些变体将在不同的线程上执行。
    猜你喜欢
    • 1970-01-01
    • 2013-02-10
    • 2011-07-05
    • 1970-01-01
    • 2011-11-23
    • 2020-06-18
    • 2012-03-22
    • 1970-01-01
    • 2012-01-30
    相关资源
    最近更新 更多