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

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

  1. 您可以使用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
        }
    }
}
  1. 您可以在使用 单例的地方创建 "app state" 服务 模式 使用户信息可在所有视图中访问

示例:

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

在你的 ViewController

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