【问题标题】:"Deferred Callback" in Objective CObjective C 中的“延迟回调”
【发布时间】:2013-08-18 21:55:09
【问题描述】:

我相信我正在尝试做的事情至少在某些范例中被称为“延迟回调”。

基本上我需要一种在另一个方法返回后调用方法的方法。像这样的:

- (void)someMethod:data
{
    [someObject doSomethingAfterCurrentMethodReturns]
}

我希望能够做到这一点,因为如果我在方法中执行我想做的事情,我必须使用的外部附件库会使应用程序崩溃。这在库的文档中有所说明。我当前的解决方法涉及额外的用户交互——抛出 UIAlertView 并将该方法放在按钮单击之后。

我见过一些似乎可以处理这个问题的库。在 Objective C 中是否有内置的方法来处理这个问题?

【问题讨论】:

  • 你调用的方法是异步的?
  • 不是,所以“延迟回调”可能不是完美的标签。因此是引号。

标签: objective-c deferred-execution


【解决方案1】:

根据方法的参数数量,您可以使用performSelector:withObject:afterDelay:。或者您可以启动一个NSTimer 并在它触发时调用该方法。

【讨论】:

  • 我的错:我的方法没有参数。这不起作用:[self performSelector:@selector(myMethod) withObject:Nil afterDelay:50]
  • 没关系,我假设 NSTimeinterval 以毫秒为单位!
  • 是否必须是特定的延迟时间,是否有条件结束循环等
  • 如果您有特定情况,为什么要寻找延期电话?
【解决方案2】:

我在 ObjC 中提出了一个 defer 声明,类似于 Go 的 defer。请参阅我的blog postGitHub repo。它看起来像这样:

- (void)someMethod:(id)data
{
  defer(^(){
    [someObject doSomethingAfterCurrentMethodReturns];
  });
  ///...
}

【讨论】:

    【解决方案3】:

    我知道这是旧的,但我想提供一个我喜欢的选项,而不是提供的解决方案,因为我不知道它是否可以保证工作并且我不想测试它。

    您希望延迟等效是正确的。我也在找这个。其他实现建议使用自动发布的自定义类。

    我最喜欢这个解决方案,因为它简单且内联:

    - (void)foo {
    // code to execute in foo
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
        // code to execute after foo() returns
    });
    

    【讨论】:

      【解决方案4】:

      你可以使用

      __attribute__((cleanup(...)))
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多