gpt4 book ai didi

objective-c - 此 View 动画概念的正确干净且线程安全的设计

转载 作者:行者123 更新时间:2023-12-03 17:56:41 25 4
gpt4 key购买 nike

我有一个名为 RunningInteger 的类,它在不同的线程上(以避免阻塞主线程)- 循环一个从 1 到 60 的整数 ivar,中间间隔 1 秒。因此,整个循环大约需要一分钟。 ivar 通过方法或只读属性提供给外界。

我有一个自定义 NSView 子类,它有 60 种不同的模式可以显示自己。

现在,这就是我想要实现的目标:

  1. 我的界面上有一个按钮。单击时,即在其操作方法内,应创建一个 RunningInteger 的新实例,并且 View 应根据该实例的 ivar 绘制自身。

  2. 但是 - 这就是问题 - 如果再次单击按钮,动画应相应重置并重新开始。这应该是线程安全的,并且不会泄漏内存,并且不会堆积任何线程。

关于如何实现这一目标有什么想法吗?

有两个特定的(可能还有许多其他)问题与此密切相关:

  • 显然,让线程不断堆积并不是一个好的设计,即使我们知道它们会在 60 秒后消失。毕竟,如果 60 秒是 1 小时呢? (这是有可能的。)

  • 我们如何确保只有 最近创建的 RunningInteger 实例才能更新 View 的显示 (setNeedsDisplay:YES)?

最佳答案

使 RunningInteger 成为单例:

+(RunningInteger *)sharedManager {
static dispatch_once_t pred;
static RunningInteger *shared = nil;

dispatch_once(&pred, ^{
shared = [[RunningInteger alloc] init];
});
return shared;
}

然后,当按钮按下按钮时,只需重置计数器即可。使用计时器定期增加单例计数器。然后从您的 View 访问单例以了解要显示的内容。

关于objective-c - 此 View 动画概念的正确干净且线程安全的设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12218623/

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