Ios 将数据从模型传递到控制器

Ios 将数据从模型传递到控制器,ios,swift,model-view-controller,Ios,Swift,Model View Controller,我想知道当我想将数据从模型传递到控制器时,什么是最佳实践 我想做什么 我想在时间改变时更新标签 CurrentTime.swift(模型) ViewController.swift class ViewController: UIViewController { @IBOutlet var timeLabel: UILabel! var currentTime = CurrentTime() override func viewDidLoad() { }

我想知道当我想将数据从模型传递到控制器时,什么是最佳实践

我想做什么
我想在时间改变时更新标签

CurrentTime.swift(模型)

ViewController.swift

class ViewController: UIViewController {

    @IBOutlet var timeLabel: UILabel!
    var currentTime = CurrentTime()

    override func viewDidLoad() {
    }

    @IBAction func closeBtnWasPressed(_ sender: UIButton) {
        dismiss(animated: true, completion: nil)
    }
}

选项1

1-添加此变量

weak var delegate: ViewController?
2-在vc的
viewDidLoad

currentTime.delegate = self
三,-

4-在vc内部

func update(_ data:String) {
  lbl.text = data
}
当然你能做到

delegate?.lbl.text = currentTime
但上面是MVC

选项2

var ob:NSKeyValueObservation!
viewDidLoad

ob =  currentTime.observe(\CurrentTime.currentTime, options: .new) { cur, tex in
    timeLabel.text = tex
}

您应该像这样定义一个动态类:

class Dynamic<T> {

    var bind: (T) -> Void = { _ in }

    var value: T? {
        didSet {
            bind(value!)
        }
    }

    init(_ v: T) {
        value = v
    }
}
var currentTime: Dynamic<String>

您可以发布一个
通知
,或者提供一种在您的模型中注册观察者闭包的方法。您应该将日期格式化程序设置为惰性私有属性,而不是在每次计时器启动时创建它。创建日期格式化程序的成本相对较高。
class Dynamic<T> {

    var bind: (T) -> Void = { _ in }

    var value: T? {
        didSet {
            bind(value!)
        }
    }

    init(_ v: T) {
        value = v
    }
}
var currentTime: Dynamic<String>
yourModel.currentTime.bind = { [weak self] time in
  self?.timeLabel.text = time
}