您可以使用一种称为Key-Value Observation的技术来做类似的事情:
class CommonObservableData: NSObject {
// Use @objc and dynamic to ensure enabling Key-Value Observation
@objc dynamic var dateTime: Date?
static let shared = CommonObservableData()
func updateFromWeb() {
// callWebThen is a function you will define that calls your Web API, then
// calls a completion handler you define, passing new value to your handler
callWeb(then: { self.dateTime = $0 })
}
}
然后你使用 Swift 4 的新 NSKeyValueObservation 观察它。
class SomeViewController: UIViewController {
var kvo: NSKeyValueObservation?
func viewDidLoad() {
...
kvo = CommonObservableData.shared.observe(
\CommonObservableData.dateTime, { model, change in
self.label.text = "\(model.dateTime)"
})
}
}
Key-Value Observation 最初是一种 Objective-C 技术,在 Swift 4 中“有所复兴”,这种技术允许您观察属性的变化(称为 Key 在 Objective-C 中)的任何对象。
所以,在前面的代码 sn-ps 中,我们创建了一个类,并将其设为单例,这个单例有一个名为 dateTime 的可观察属性,我们可以在其中观察该属性的变化,并在其中进行任何更改此属性会自动调用我们可以更新 UI 的方法。
在此处了解 KVO:
Key-Value Observation Apple Programming Guide
Key-Value Observation using Swift 4
另外,如果你喜欢 Rx 和 RFP(反应式函数式编程),你可以使用 RxSwift 并使用它以更简洁的方式进行观察。