gpt4 book ai didi

ios - swift 从模型(networkClient)通知ViewController

转载 作者:搜寻专家 更新时间:2023-11-01 06:56:28 25 4
gpt4 key购买 nike

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

最佳答案

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

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

所以操作顺序是这样的:

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

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

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

关于ios - swift 从模型(networkClient)通知ViewController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53132546/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com