在swift中使用Timers的替代方法

时间:2017-08-01 18:53:49

标签: swift xcode optimization timer performance-testing

只是一个普遍的问题。我的项目使用十个不同的快速定时器,以便根据用户选择的设置更改UI。设置保存到按键,定时器用于每秒读取。这是有效的,问题是它导致我的应用程序使用34%的CPU,高能量和20%的开销。我想知道是否有其他方法来检查用户是否对应用程序的设置进行了任何更改,并因此更新了各种视图控制器。

2 个答案:

答案 0 :(得分:0)

定期调用函数只是为了检查某些变量是否真的变坏了。

您有多种方法可以实现自动UI更新。其中一种方法如下所述。

Swift具有属性观察者,当某个属性/变量发生变化时,系统会自动调用这些属性观察者。您需要做的就是为每个用于向UI提供数据的属性设置属性观察器,并从属性观察者内部更新UI。

假设您有变量a,用于存储要显示的labelA数据。下面是一个已经过测试和运行的Playground示例。

class MyViewController: UIViewController {
    var label:UILabel = UILabel(frame: CGRect(x: 20, y: 20, width: 100, height: 30))

    override func viewDidLoad() {
        super.viewDidLoad()
        label.text = a
        label.textColor = .black
        self.view.addSubview(label)
        view.backgroundColor = .white
    }

    var a = "first" {
        didSet {
            label.text = a
        }
    }
}

let myVC = MyViewController()
PlaygroundPage.current.liveView = myVC
sleep(10)
myVC.a = "new value"

如果更改变量a的值,您可以看到标签上的文字会自动更改。

答案 1 :(得分:0)

  1. 使用单例模式创建Settings类/结构,它提供应用的所有设置。

  2. Settings中,当属性发生变化时,使用didSet更新您的数据存储(用户默认值/核心数据/云存储)。

  3. 如果您希望更改立即反映在GUI中,请使用视图控制器的键值观察。