【问题标题】:Get Return Value of NSTimer's Target获取 NSTimer 的 Target 的返回值
【发布时间】:2010-10-10 14:08:56
【问题描述】:

我有一个这样设置的 NSTimer:

[NSTimer scheduledTimerWithTimeInterval:0.5 target:timerTarget selector:NSSelectorFromString(targetSelector) userInfo:nil repeats:YES];

如何获取timerTarget方法的返回值?

【问题讨论】:

    标签: objective-c cocoa return nstimer


    【解决方案1】:

    你不能,因为没有返回值。

    documentation of the scheduledTimerWithTimeInterval::::: method:

    选择器必须具有以下签名:

    - (void)timerFireMethod:(NSTimer*)theTimer
    

    现在,您可以以不同的方式声明您的方法,然后在其中返回一个值,但是您的方法的签名与 NSTimer 预期的不同。现在可以正常工作,但不能保证将来可以正常工作——它可能随时中断,尤其是运行时的更改。

    更重要的是,由于 NSTimer 不期望返回值,因此它没有规定可以接收一个并将其传递到任何地方。

    此外,正如我在对亚当回答的评论中所说,您对 scheduledTimerWithTimeInterval::::: 的调用只返回一次,并且(正如亚当所说)它会立即返回。您不会每 0.5 秒获得一个返回值,因为您不会每 0.5 秒获得一个返回值——您(每个计时器)获得一个返回值。

    无论您在计时器方法中找到什么信息,您都需要在那里对其进行操作,或者将带有信息的消息从那里发送到另一个方法。

    【讨论】:

      【解决方案2】:

      按照 Adam 的好回答,如果您觉得在目标方法完成运行后需要返回值,那么您可能想要做的是让目标方法本身继续执行一些进一步的操作。

      例如,您可以使用“userInfo”参数传递对感兴趣对象(self?)的引用。然后,目标方法可以使用预先安排的选择器将更新的值发送给自身,而不是返回值。例如,在您的目标方法中,您可以以如下方式结束:

      [[theTimer userInfo] setWhatever:blah];
      

      从概念上讲,您需要听取 Adam 的建议,并考虑计时器调用的方法将在未来发生的事实,如果您想连接回特定的类及其工作流,您需要自己以某种方式连接它.

      【讨论】:

        【解决方案3】:

        你对返回值做了什么?目标在 0.5 秒后异步运行。对scheduledTimerWithTimeInterval:target:selector:useInfo:repeats: 的调用会立即返回,此时目标尚未运行。如果你现在确实需要返回值,那么就不要打扰定时器,直接调用选择器就可以了。

        【讨论】:

        • 我需要每 0.5 秒返回一次值。目标正在监视一个经常更改的值,并返回该值,以便我可以查看是否确实发生了更改。
        • 那么你应该对定时器方法的改变采取行动。请记住,scheduledTimerWithTimeInterval::::: 只返回 once。每次调用计时器时,它不会返回一次。你调用了 scheduledTimer...::::: 一次,所以它返回一次。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-25
        • 1970-01-01
        • 1970-01-01
        • 2021-10-16
        • 2016-01-03
        • 1970-01-01
        相关资源
        最近更新 更多