使用 Swift 在 iOS 中的许多 ViewController 中保持值更新
Keeping a value updated throughout many ViewController's in iOS using Swift
在我的 ViewController (VC1) 中,我有以下变量:
var orderInfo: Order!
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 中,我有一个从 Firestore 数据库更新其信息的侦听器(throught addsnapshotslistener)。当变量 orderInfo
由于数据库中的顺序更改而在 VC1 中更新时,侦听器将更新 VC1 中的 orderInfo
变量。当用户在另一个 ViewController(例如 VC2)中时,我想访问 orderInfo
变量及其来自 VC1 的更新信息。我怎样才能做到这一点?
有很多方法可以做到这一点。让我们谈谈其中的一些。
- 您可以使用NotificationCenter
例子
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
}
}
}
- 您可以在使用 单例的地方创建 "app state" 服务
模式 使用户信息可在所有视图中访问
示例:
class AppState {
static let shared = AppState()
var orderInfo: Order!
...
}
在你的 ViewController
class ViewController: UIViewController {
func doSomeWork() {
print(AppState.shared.orderInfo)
}
}
- 您可以将其设为全局(不推荐)
在我的 ViewController (VC1) 中,我有以下变量:
var orderInfo: Order!
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 中,我有一个从 Firestore 数据库更新其信息的侦听器(throught addsnapshotslistener)。当变量 orderInfo
由于数据库中的顺序更改而在 VC1 中更新时,侦听器将更新 VC1 中的 orderInfo
变量。当用户在另一个 ViewController(例如 VC2)中时,我想访问 orderInfo
变量及其来自 VC1 的更新信息。我怎样才能做到这一点?
有很多方法可以做到这一点。让我们谈谈其中的一些。
- 您可以使用NotificationCenter
例子
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
}
}
}
- 您可以在使用 单例的地方创建 "app state" 服务 模式 使用户信息可在所有视图中访问
示例:
class AppState {
static let shared = AppState()
var orderInfo: Order!
...
}
在你的 ViewController
class ViewController: UIViewController {
func doSomeWork() {
print(AppState.shared.orderInfo)
}
}
- 您可以将其设为全局(不推荐)