在我的ViewController(VC1(中,我有以下变量:
var orderInfo: Order!
订单本身就是一个结构,如下所示:
struct Order {
var orderId: String
var orderReferenceNumber: String
//more variables...
init(
orderId: String,
orderReferenceNumber: String,
){
self.orderId = orderId
self.orderReferenceNumber = orderReferenceNumber
}
init(data: [String: Any]){
orderId = data[DatabaseRef.orderId] as? String ?? ""
orderReferenceNumber = data[DatabaseRef.orderReferenceNumber] as? String ?? ""
}
static func modelToData(order: Order) -> [String: Any] {
let data : [String: Any] = [
DatabaseRef.orderId: order.orderId,
DatabaseRef.orderReferenceNumber: order.orderReferenceNumber,
]
return data
}
}
在VC1中,我有一个监听器,它通过addsnapshotslistener更新Firestore数据库中的信息。当变量orderInfo
由于数据库中的顺序发生变化而在VC1中更新时,侦听器将更新VC1中的orderInfo
变量。当用户在另一个ViewController(例如VC2(中时,我想访问orderInfo
变量及其来自VC1的更新信息。我怎样才能做到这一点?
有很多方法可以做到这一点。让我们来谈谈其中的一些。
- 您可以使用通知中心
示例
class VC1: UIViewController {
var orderInfo: Order!
func updateOrder() {
var orderDict = ["orderInfo":orderInfo]
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "orderInfoUpdated"), object: nil, userInfo: orderDict)
}
}
// The receiving end
class VC2: UIViewController {
var orderInfo: Order!
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(doSomething(_: )), name: NSNotification.Name(rawValue: "orderInfoUpdated"), object: nil)
}
func doSomething(_ notification: NSNotification) {
if let orderInfo = notification.userInfo?["orderInfo"] as? Order {
// Do something
}
}
}
- 您可以创建一个"应用程序状态"服务,使用单例模式使用户信息在所有视图中都可以访问
示例:
class AppState {
static let shared = AppState()
var orderInfo: Order!
...
}
在您的ViewController 上
class ViewController: UIViewController {
func doSomeWork() {
print(AppState.shared.orderInfo)
}
}
- 您可以将其设置为全局(不推荐(