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

标签 objective-c multithreading cocoa thread-safety grand-central-dispatch

我有一个名为 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/

相关文章:

ios - 是否可以在 nib 中使用 View Controller ?还是只是 UIViews?

cocoa - Cocoa应用程序中使用AVPLAYER的视频慢动作

java - 多线程执行顺序

针对特定情况的 Android AsyncTask 与线程

macos - Cocoa 中 GetKeys() 的现代等价物是什么?

objective-c - NSCollectionView 不显示其内容

iphone - 自定义 NavigationBar 按钮在 iOS 7 中看起来不同

ios - UIKeyboard 在 iOS7 中不会自动半透明

ios - 有没有办法检查照片是否是在该 iPhone 上拍摄的?

java - 我的 JDialog 有时会收到来自调用应用程序的多余按键? (提供代码)