gpt4 book ai didi

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

转载 作者:技术小花猫 更新时间:2023-10-29 10:23:40 26 4
gpt4 key购买 nike

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com