迅速从模型(networkClient)通知ViewController

时间:2018-11-03 15:04:35

标签: ios swift model-view-controller nsnotificationcenter uiapplicationdelegate

我的应用程序中有一些复杂的网络(由于项目要求,我不使用任何第三方依赖项)。例如,在前两个请求提供结果之后,我并行发送了三个网络请求。我所有的联网工作都是在单独的模型中完成的,这些模型称为networkClients(遵循MVC-S模式),并且直接从存储库中而不是从ViewControllers中被调用但是,在收到网络响应后,我需要最后一个请求通知我的viewController。我该怎么做?我认为通知中心不是正确的解决方案,因为它可能导致内存泄漏,而且我还没有找到解决此类复杂问题的正确方法。请提供一些突出的解决方案。它应符合良好的设计模式,例如MVVM或MVC,并且不应采用其他解决方法或修改。也许代表们会工作? 我知道rxSwift可以解决我的问题,因为在初始化viewController之后我可以开始观察结果,并且从存储库中更新数据后,我的viewController也将得到通知...

1 个答案:

答案 0 :(得分:2)

正确的设计没有使VC直接观察网络客户端的方法。这些网络操作应该是VC真正关心的模型的组成部分。让VC观察那个奇异模型。

它可以使用一种众所周知的对象间松耦合通信模式进行观察。 OP正确提及了代表。通知中心和KVO是其他人。关于SO的使用和实现方法,有很多讨论。 (我会选择NSNotificationCenter作为一个简单而合理的起点)。

所以操作顺序如下:

  1. 分配模型
  2. 启动网络请求并设置这些请求完成(可能是完成块),以使用其响应更新该模型。 (该模型可以启动请求,这是一种合理的做法)。
  3. 创建在模型初始化时设置模型观察的视图控制器(可能在viewWillAppear或更高版本中)

同时有1个以上的请求正在处理中呢?上面的评论者正确地指出,GCD提供了一种将这些异步操作分组为单个操作的方法。但是您可以自己直接进行此操作:模型将决定何时完全构建。每个请求的完成代码会将模型中的某些条件更改为“就绪”状态。每个请求完成都可以检查是否满足所有就绪条件,然后才发布“ ready”通知供观察者查看。

另一个麻烦的问题:如果这些请求都非常非常快地运行怎么办?也许有些缓存的响应很早就准备好了,从而使模型在VC有机会进行观察之前“准备就绪”了?直接在VC中进行处理:在观察模型之前,请检查模型是否已经准备就绪,并运行与通知相同的更新代码。