Ios (云firestore)vc1在文档上有快照侦听器,将文档数据传递给vc2。vc2将数据写入文档,如何更新vc2上的数据?

Ios (云firestore)vc1在文档上有快照侦听器,将文档数据传递给vc2。vc2将数据写入文档,如何更新vc2上的数据?,ios,swift,firebase,google-cloud-firestore,Ios,Swift,Firebase,Google Cloud Firestore,我的第一个视图控制器在一个文档上有一个snapshotlistener,然后将此文档数据传递到我的第二个视图控制器-通过让vc=vc2(数据:数据),用户可以导航到我的第二个VCController,并可以选择将数据写入文档 当用户写入文档时,我的快照侦听器启动,vc1中的数据被更新,但显然vc2中的数据不会被更新 我可以在vc2中添加一个函数,以便在调用该函数进行写入时立即从firebase读取数据,但我很好奇是否有更好的方法将数据从vc1传递到vc2,以便在vc1中的快照侦听器触发时更新vc

我的第一个视图控制器在一个文档上有一个snapshotlistener,然后将此文档数据传递到我的第二个视图控制器-通过让vc=vc2(数据:数据),用户可以导航到我的第二个VCController,并可以选择将数据写入文档

当用户写入文档时,我的快照侦听器启动,vc1中的数据被更新,但显然vc2中的数据不会被更新

我可以在vc2中添加一个函数,以便在调用该函数进行写入时立即从firebase读取数据,但我很好奇是否有更好的方法将数据从vc1传递到vc2,以便在vc1中的快照侦听器触发时更新vc2中的数据?

此决定取决于(1)这将涉及多少视图控制器,以及(2)如何在应用程序的其他地方处理这些类型的情况

对于第一点,如果除了第二个视图控制器之外,没有其他视图控制器需要知道该数据,那么当数据更新时,让第一个视图控制器调用第二个视图控制器上的方法即可。但是如果这个导航堆栈上有更多的视图控制器需要知道这个数据更新,那么我会考虑其他的东西——也许是一个共享资源,比如一个数据管理器或一个视图模型,所有视图控制器都观察或发布一个本地通知。 关于第二点,要始终如一。无论您通常如何处理这些实时数据情况,请尝试继续这样做。例如,如果您通常使用协议,请在此处使用它们

但是,在第二个视图控制器是第一个视图控制器中对数据更新感兴趣的唯一其他对象的情况下,为了简单起见,只需让第一个视图控制器通知第二个视图控制器:

class VC1: UIViewController {
    private var vc2: VC2? // Make it an instance property that the navigation controller pushes to.
    
    Firestore.firestore().document(docPath).addSnapshotListener({ (snapshot, error) in
        vc2?.dataDidUpdate() // If the second view controller was never instantiated, the optional chaining of vc2 will fail silently.
    })
}

class VC2: UIViewController {
    func dataDidUpdate() {
        // update UI
    }
}
这一决定取决于(1)有多少视图控制器将进入深度,以及(2)您如何处理应用程序中其他位置的此类情况

对于第一点,如果除了第二个视图控制器之外,没有其他视图控制器需要知道该数据,那么当数据更新时,让第一个视图控制器调用第二个视图控制器上的方法即可。但是如果这个导航堆栈上有更多的视图控制器需要知道这个数据更新,那么我会考虑其他的东西——也许是一个共享资源,比如一个数据管理器或一个视图模型,所有视图控制器都观察或发布一个本地通知。 关于第二点,要始终如一。无论您通常如何处理这些实时数据情况,请尝试继续这样做。例如,如果您通常使用协议,请在此处使用它们

但是,在第二个视图控制器是第一个视图控制器中对数据更新感兴趣的唯一其他对象的情况下,为了简单起见,只需让第一个视图控制器通知第二个视图控制器:

class VC1: UIViewController {
    private var vc2: VC2? // Make it an instance property that the navigation controller pushes to.
    
    Firestore.firestore().document(docPath).addSnapshotListener({ (snapshot, error) in
        vc2?.dataDidUpdate() // If the second view controller was never instantiated, the optional chaining of vc2 will fail silently.
    })
}

class VC2: UIViewController {
    func dataDidUpdate() {
        // update UI
    }
}

您可以使用一个类来表示应用程序的“状态”——它将包含侦听器和当前firestorm数据。该类将通过引用(而不是值)通过视图控制器传递。然后,任何有权访问该类的vc都会看到更新。根据您的结构,您可以让vc2成为vc1的观察者。就我个人而言,我会创建一个视图模型,该模型监听firebase,并让vc1和vc2监听视图模型中的更改。您可以有一个类来表示应用程序的“状态”——它将包含侦听器和当前firestorm数据。该类将通过引用(而不是值)通过视图控制器传递。然后,任何有权访问该类的vc都会看到更新。根据您的结构,您可以让vc2成为vc1的观察者。就个人而言,我会创建一个视图模型,该模型监听firebase,并让vc1和vc2监听视图模型中的更改。