objective-c - 是否有一种简单的方法(在 Cocoa/iOS 中)将方法调用排队,以便在下一个运行循环中运行一次?

标签 objective-c ios cocoa-touch cocoa

UIView 有一个 setNeedsDisplay 方法,可以在同一个事件循环中调用多次,安全地知道重绘工作很快就会发生,而且只有一次。

对于这种行为 Cocoa 是否有通用机制?一种说法是,“将选择器加入队列的次数不限,时间到了,选择器将运行一次并清除队列。”

我知道我可以通过目标中的某种状态跟踪或 NSOperationQueue 来做到这一点。我只是想知道是否有我错过的轻量级方法。

(当然,答案可能是“否”。)

最佳答案

setNeedsDisplay 不是您所描述的一个很好的例子,因为它实际上在您每次调用它时都会运行。它只是设置了一个标志。但是这个问题很好。

一种解决方案是使用 NSNotificationQueue使用 NSNotificationCoalescingOnName

另一个解决方案是构建一个蹦床来自己进行合并。我没有关于蹦床的非常好的博客引用,但这里有一个例子 ( LSTrampoline )。如果您想在一段时间内合并消息,构建它并不难。我曾经用 forwardInvocation: 构建了一个蹦床,类似于:

- (void)forwardInvocation:(NSInvocation *)invocation {
  [invocation setTarget:self.target];
  [invocation retainArguments];
  [self.timer invalidate];
  self.timer = [NSTimer scheduledTimerWithTimeInterval:self.timeout invocation:invocation repeats:NO];
}

这实际上将一段时间内的所有消息合并到对象(不仅仅是匹配消息)。这就是我解决特定问题所需的全部内容。但是您可以对此进行扩展以跟踪正在合并哪些选择器,并检查您的调用以查看它们是否“充分匹配”。

要让它在下一个事件循环中运行,只需将超时设置为 0。

我一直想写关于蹦床的博客。所需先令:我的upcoming book第 4 章和第 20 章介绍了蹦床。

关于objective-c - 是否有一种简单的方法(在 Cocoa/iOS 中)将方法调用排队,以便在下一个运行循环中运行一次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7518213/

相关文章:

objective-c - 如何改变rootViewController的 View ?

java - 如何使用 Java 代码为 iOS 创建钛移动模块?

ios - 从另一个线程通知 UITable

objective-c - 如何为控件分配名称并在事件方法中检索它?

objective-c - 如何为 NSDate 添加 1 天?

objective-c - 在 SplitViewController 中弹出一个 ViewController

ios - xcode-字符串执行错误

ios - 使用相同的请求标识符同时注册 2 个本地通知而不覆盖

iphone - 是否可以通过编程方式调暗 iPhone 相机闪光灯的光线?

objective-c - NSWindow 始终位于顶部(或不可见)