Обновление значения во многих ViewController в iOS с использованием Swift - PullRequest
0 голосов
/ 16 апреля 2020

В моем 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 (через addnapshotslistener). Когда переменная orderInfo обновляется в VC1 из-за изменения порядка в базе данных, слушатель обновит переменную orderInfo в VC1. Пока пользователь находится в другом ViewController (например, VC2), я хотел бы получить доступ к переменной orderInfo с ее обновленной информацией из VC1. Как я могу это сделать?

1 Ответ

1 голос
/ 16 апреля 2020

Есть множество способов сделать это. Упомянем некоторые из них.

  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
        }
    }
}
Вы можете создать службу «Состояние приложения», в которой вы используете одноэлементный шаблон , делая информацию пользователя доступной во всех представлениях

Пример:

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

На вашем ViewController

class ViewController: UIViewController {
    func doSomeWork() {
        print(AppState.shared.orderInfo)
    }
}
Вы можете сделать его глобальным (не рекомендуется)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...