0

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

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

现在,这就是我想要完成的:

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

  2. 然而——这就是问题——如果再次单击按钮,动画应该相应地重置并重新开始。这应该是线程安全的,不应该有内存泄漏,也不应该有线程堆积。

关于如何做到这一点的任何想法?

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

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

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

4

1 回答 1

1

使 RunningInteger 成为单例:

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

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

Then simply reset your counter when the button presses the button. Use a timer to increase the singleton counter at regular interval. Then access the singleton from your view to know what to display.

于 2012-08-31T15:46:52.187 回答