使用 Swift 在 iOS 中的许多 ViewController 中保持值更新



在我的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的更新信息。我怎样才能做到这一点?

有很多方法可以做到这一点。让我们来谈谈其中的一些。

  1. 您可以使用通知中心

示例

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
}
}
}
  1. 您可以创建一个"应用程序状态"服务,使用单例模式使用户信息在所有视图中都可以访问

示例:

class AppState {
static let shared = AppState()
var orderInfo: Order! 
...
}

在您的ViewController 上

class ViewController: UIViewController {
func doSomeWork() {
print(AppState.shared.orderInfo)
}
}
  1. 您可以将其设置为全局(不推荐(

相关内容

  • 没有找到相关文章

最新更新