首页 > 解决方案 > 迅速从模型(networkClient)通知ViewController

问题描述

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

标签: iosswiftmodel-view-controllernsnotificationcenteruiapplicationdelegate

解决方案


正确的设计不会让 VC 直接观察网络客户端。这些网络操作应该是组装模型的一部分,这是 VC 真正关心的。让 VC 观察那个奇异模型。

它可以使用对象之间松散耦合通信的一种众所周知的模式来进行这种观察。OP 正确地提到了代表。通知中心和 KVO 是其他的。关于使用哪个以及如何实现的 SO 有很多讨论。(我会NSNotificationCenter作为一个简单而理性的开始)。

所以操作顺序是这样的:

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

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

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


推荐阅读