从 swift 中的模型(networkClient)通知 ViewController
Notifying ViewController from model(networkClient) in swift
我的应用程序中有一些复杂的网络(由于项目要求,我不使用任何第三方依赖项)。例如,在前两个请求提供结果后,我并行发送三个网络请求。我所有的网络都是在单独的模型中完成的,称为 networkClients(遵循 MVC-S 模式)并且 直接从存储库 调用,而不是从 ViewControllers 调用。 但是,我需要在收到网络响应后通知我的 viewController 最后一个请求。 我应该怎么做?我认为通知中心不是正确的解决方案,因为它会导致内存泄漏,而且我还没有找到解决此类复杂问题的正确方法。请提供一些突出的解决方案。它应该符合良好的设计模式,如 MVVM 或 MVC,不应该是一些解决方法或 hack。也许代表会工作? 我知道 rxSwift 会解决我的问题,因为我可以在初始化 viewController 后开始观察结果,并且在从存储库更新数据后,我的 viewController 也会收到通知...
正确的设计没有 VC 直接观察网络客户端。这些网络操作应该是 模型 的组装部分,这是 VC 真正关心的。让 VC 观察那个奇异模型。
它可以使用一种众所周知的对象间松散耦合通信模式来进行观察。 OP 正确地提到了代表。通知中心和 KVO 是其他的。关于 SO 使用哪个以及如何实施的讨论很多。 (我会选择 NSNotificationCenter
作为一个简单而合理的开始)。
所以操作顺序是这样的:
- 分配模型
- 启动网络请求并设置这些请求完成(可能是完成块)以使用它们的响应更新该模型。 (模型可以发起请求,这是一种合理的做法)。
- 创建在初始化时设置模型观察的视图控制器(可能在
viewWillAppear
或更高版本中)
如果有 >1 个请求同时在进行中呢?上面的一位评论者正确地指出,GCD 提供了一种将这些异步操作组合成一个单一操作的方法。但是您可以自己直接执行此操作:模型决定何时完全构建。每个请求的完成代码会将模型中的某些条件更改为 "ready" 状态。每个请求完成可以检查所有的就绪条件是否满足,然后post一个"ready"通知观察者可以看到。
另一个棘手的问题:如果这些请求全部 运行 非常非常快怎么办?也许有一些提前准备好的缓存响应,使模型 "ready" 在 VC 有机会设置观察之前?在 VC 中直接处理此问题:在观察模型之前,检查它是否已经准备就绪,并且 运行 与通知中 运行 相同的更新代码。
我的应用程序中有一些复杂的网络(由于项目要求,我不使用任何第三方依赖项)。例如,在前两个请求提供结果后,我并行发送三个网络请求。我所有的网络都是在单独的模型中完成的,称为 networkClients(遵循 MVC-S 模式)并且 直接从存储库 调用,而不是从 ViewControllers 调用。 但是,我需要在收到网络响应后通知我的 viewController 最后一个请求。 我应该怎么做?我认为通知中心不是正确的解决方案,因为它会导致内存泄漏,而且我还没有找到解决此类复杂问题的正确方法。请提供一些突出的解决方案。它应该符合良好的设计模式,如 MVVM 或 MVC,不应该是一些解决方法或 hack。也许代表会工作? 我知道 rxSwift 会解决我的问题,因为我可以在初始化 viewController 后开始观察结果,并且在从存储库更新数据后,我的 viewController 也会收到通知...
正确的设计没有 VC 直接观察网络客户端。这些网络操作应该是 模型 的组装部分,这是 VC 真正关心的。让 VC 观察那个奇异模型。
它可以使用一种众所周知的对象间松散耦合通信模式来进行观察。 OP 正确地提到了代表。通知中心和 KVO 是其他的。关于 SO 使用哪个以及如何实施的讨论很多。 (我会选择 NSNotificationCenter
作为一个简单而合理的开始)。
所以操作顺序是这样的:
- 分配模型
- 启动网络请求并设置这些请求完成(可能是完成块)以使用它们的响应更新该模型。 (模型可以发起请求,这是一种合理的做法)。
- 创建在初始化时设置模型观察的视图控制器(可能在
viewWillAppear
或更高版本中)
如果有 >1 个请求同时在进行中呢?上面的一位评论者正确地指出,GCD 提供了一种将这些异步操作组合成一个单一操作的方法。但是您可以自己直接执行此操作:模型决定何时完全构建。每个请求的完成代码会将模型中的某些条件更改为 "ready" 状态。每个请求完成可以检查所有的就绪条件是否满足,然后post一个"ready"通知观察者可以看到。
另一个棘手的问题:如果这些请求全部 运行 非常非常快怎么办?也许有一些提前准备好的缓存响应,使模型 "ready" 在 VC 有机会设置观察之前?在 VC 中直接处理此问题:在观察模型之前,检查它是否已经准备就绪,并且 运行 与通知中 运行 相同的更新代码。