Ios 在swift中从模型(networkClient)通知ViewController

Ios 在swift中从模型(networkClient)通知ViewController,ios,swift,model-view-controller,nsnotificationcenter,uiapplicationdelegate,Ios,Swift,Model View Controller,Nsnotificationcenter,Uiapplicationdelegate,我的应用程序中有一些复杂的网络(由于项目要求,我不使用任何第三方依赖项)。例如,在前两个请求提供结果之后,我并行发送三个网络请求。我的所有联网都是在单独的模型中完成的,称为NetworkClient(遵循MVC-S模式),直接从存储库调用,而不是从ViewController调用但是,在收到网络响应后,我需要最后一个请求来通知我的viewController。我应该怎么做?我不认为NotificationCenter是正确的解决方案,因为它会导致内存泄漏,而且我还没有找到解决此类复杂问题的正确方

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

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

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

所以操作的顺序是这样的:

  • 分配模型
  • 启动网络请求并设置这些请求完成(可能是完成块),以使用响应更新该模型。(模型可以启动请求,这是一种合理的做法)
  • 创建视图控制器,在初始化时设置模型观测(可能在
    视图中出现
    或更高版本)
  • 如果同时有>1个请求在运行中,这一事实又如何呢?上面的一位评论者正确地指出,GCD提供了一种将这些异步操作分组为单个操作的方法。但你可以自己直接做:模型决定何时完成构建。每个请求的完成代码将把模型中的某些条件更改为“就绪”状态。每个请求完成后都可以检查是否满足所有就绪条件,然后才发布“就绪”通知,供观察者查看


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

    您能澄清“最后一个请求”吗?你是说最后一个完成吗?我认为通知中心非常适合这种情况。模式用于解决问题,而不是导致问题。@danh是的,最后一个请求完成,并获得一些数据(该请求被多次调用,直到满足特定条件,然后API锁定停止)。但每次都应该将结果发送到viewController。@这意味着我使用dispatchGroup只是为了另一个目的。例如:它帮助我决定何时发送最终请求。它工作得非常好。然而,在DispatchGroup激发notify之后,我应该如何通知我的ViewController?这是非常清楚的解释。非常感谢你的两段话。。也许我并没有很好地解释我自己,但这就是我对来自模型的网络请求的意思。模型(称为存储库)在另一个请求处理完成块后启动所需的网络请求。此模型(存储库)使用另一个模型(网络客户端)以及创建请求和执行请求所需的所有代码。之后(网络客户端)向存储库提供完成块,我的存储库可以启动通知,是吗?:)这个通知应该在VC中被遵守,是吗?@ViktorVostrikov-我想我理解你,是的。这听起来像是存储库,一旦建立起来,就包含了VC需要知道的一切。因此,将其称为VC的模型是合理的。让存储库检查就绪条件,并让它通知世界它已经就绪。我可能不会将“模型”一词应用于网络客户端。是的,但有一个更详细的问题需要澄清:这个存储库是singleton,因为它有一些信息,其他VC也需要这些信息,并且逻辑是共享的。就像第一个VC做1/3的工作一样,第二个VC做另外1/3的工作,第三个VC做最后一部分。所有与整个应用程序功能相关的数据都存储在存储库中。我发现在这种情况下,单例模式是一个不错的主意。是的,网络客户端可能被称为helper@ViktorVostrikov,我同意。真的谢谢你。。。这个信息是无价的!你应该写一些博客或者中篇文章!10/10质量!