ฉันมีซูเปอร์คลาสสามคลาสพร้อมคลาสย่อย 2 คลาสดังนี้:
class BaseLookupViewController {
}
class RetrieveCompletedordersViewController: BaseLookupViewController {
}
class LoginViewController: BaseLookupViewController {
}
ใน BaseLookupViewController ฉันมีคุณสมบัติ 'deviceOnline':
internal var deviceConnected = true
สิ่งนี้ถูกตั้งค่าโดยใช้ผู้สังเกตการณ์จากคลาสอื่น:
override public func viewDidLoad() {
super.viewDidLoad()
stackView.customPadding(Constants.stackViewPadding, after: submitButton)
addConectivityObserver()
}
// MARK: - Configuration
private func addConectivityObserver() {
NotificationCenter.default.addObserver(self, selector: #selector(connectivityChanged(notification:)), name: .connectivityStatusChanged, object: nil)
}
@objc private func connectivityChanged(notification: Notification) {
if notification.object as? ConnectionService.ConnectionStatus == .connected {
deviceConnected = true
} else {
deviceConnected = false
}
}
เมื่อตั้งค่าบูลแล้ว ฉันจำเป็นต้องทริกเกอร์เมธอดเฉพาะในแต่ละคลาสย่อย ตัวอย่างเช่น ใน RestoreeCompletedordersViewController ฉันต้องการทริกเกอร์สิ่งต่อไปนี้:
if deviceConnected {
self.tabBarItem.image = #imageLiteral(resourceName: "retrieve_completed")
self.errorLabel?.isHidden = true
} else {
self.tabBarItem.image = #imageLiteral(resourceName: "retrieve_offline")
self.errorLabel?.isHidden = false
}
และวิธีการที่คล้ายกัน แต่เห็นได้ชัดในคุณสมบัติที่แตกต่างกันในคลาสย่อยอื่น ฉันต้องการหลีกเลี่ยงการเพิ่มผู้สังเกตการณ์คุณสมบัติให้กับแต่ละคลาสย่อยเนื่องจากดูเหมือนไม่จำเป็น วิธีที่สะอาดที่สุดน่าจะเป็นการตั้งค่าคุณสมบัติของคลาสย่อยภายในเมธอด willSet ของ 'deviceConnected' แต่เนื่องจากคลาสเหล่านี้ไม่ใช่ BaseLookupViewController แบบซิงเกิลตัน วิธีที่สะอาดที่สุดในการบรรลุสิ่งนี้โดยไม่ต้องใช้รหัสซ้ำคืออะไร