Ios 将数据更新传播到许多ViewController的传统体系结构是什么?

Ios 将数据更新传播到许多ViewController的传统体系结构是什么?,ios,cocoa-touch,Ios,Cocoa Touch,我正在开发一个有三个视图的应用程序,它们都同时在屏幕上,共享相同的数据模型,一个Swift对象,它也有子对象。每个视图以不同的方式显示数据,并为用户提供修改数据的方式,如重新排序项目、添加/删除项目等。此外,某些用户操作会触发对模型的异步更新,如从API获取项目的附加信息。我的目标是找到一种体系结构,它允许我通知每个视图的控制器数据的更新,而不必在视图控制器之间进行强制通信 解决此问题的常规方法是什么?常见方法是订阅通知观察员已发生更新的通知: [[NSNotificationCenter de

我正在开发一个有三个视图的应用程序,它们都同时在屏幕上,共享相同的数据模型,一个Swift对象,它也有子对象。每个视图以不同的方式显示数据,并为用户提供修改数据的方式,如重新排序项目、添加/删除项目等。此外,某些用户操作会触发对模型的异步更新,如从API获取项目的附加信息。我的目标是找到一种体系结构,它允许我通知每个视图的控制器数据的更新,而不必在视图控制器之间进行强制通信


解决此问题的常规方法是什么?

常见方法是订阅通知观察员已发生更新的通知:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateData:) name:kAppDidUpdateDataNotification object:nil];
然后,数据源可以向订阅者发送通知:

[[NSNotificationCenter defaultCenter] postNotificationName:kAppDidUpdateDataNotification
                                                    object:object];

另一种方法是拥有一个共享的数据源并在其上使用。KVO允许您订阅
密钥路径上的更新(如数据源上的属性)。KVO有点小,我建议使用一个将它封装成块的库,或者考虑类似的框架具有类似的属性。请注意,您也可以使用KVO,如果您有一个项目的
NSMutableArray
,其中有多个表视图控制器显示这些项目,并且您希望在从数组中删除对象时为特定索引处的行的删除设置动画,这将非常好。由于您提到了重新排序和添加/删除项目,这可能特别适合您。

将代理列表添加到数据模型中,并且每当发生事件时,循环列表并通知其代理。这是Objective-C委托模式的扩展,与notification center的
addObserver
/
removeObserver
非常相似

protocol DataModelDelegate {
    func dataModel(dataModel: DataModel, didFetchData data: String) // Or any other events
}

class DataModel {
    private delegates = [DataModelDelegates]()

    func addDelegate(delegate: DataModelDelegate) { delegates.append(delegate) }
    func removeDelegate(delegate: DataModelDelegate) { // Remove `delegate` from `delegates` }

    func dataFetched(data: String) { // Or any other events
        for d in delegates { d.dataModel(self, didFetchData: data) }
    }
}

...

class ViewController1: UIViewController, DataModelDelegate {
    private dataModel: DataModel!

    init(dataModel: DataModel) {
        ...
        self.dataModel = dataModel
        dataModel.addDelegate(self)
        ...
    }

    deinit {
        // Retain cycle without this!
        dataModel.removeDelegate(self)
    }

    func dataModel(dataModel: DataModel, didFetchData data: String) {
        // Update UI, etc
    }

}
通知中心也将完成这项工作,但IMO通知中心应仅用于松耦合情况(即通知发送方和通知接收方彼此不太了解);如果视图控制器对其共享数据模型非常了解,那么委托/多重委托是更好的方法


此外,根据您的问题,数据模型的生命周期可能独立于其视图控制器(例如,作为单体),或者由其中一个视图控制器管理。

谢谢您的回答。我们曾考虑过反应可可,但由于项目处于非常不稳定的状态,我们有点犹豫是否全力以赴;更不用说切换到这种截然不同的编程范式的认知开销了。NSNotificationCenter似乎足够简单,但更细粒度的KVO观察似乎非常适合我们的用例,正如您所提到的。您知道是否有任何swift库可以包装KVO以使其不那么毛茸茸的吗?我对swift不是非常熟悉,所以我不确定哪些库最适合使用。根据我的研究,这似乎是一种传统的方法