从swift中的模型(networkClient)通知ViewController



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

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

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

所以操作顺序是这样的:

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

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

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

最新更新