【问题标题】:Swift handling error responsibilities using VIPER and services使用 VIPER 和服务快速处理错误责任
【发布时间】:2021-03-12 20:49:50
【问题描述】:

我找到了这个article 如何构建viper 模块。一件事对我来说仍然存在疑问,我不知道哪个元素负责处理响应。

所以我们通常在 VIPER 循环中有下一个队列

  1. ViewController 请求演示者在 viewDidLoad 上执行 smth,例如在后台下载 smth。
  2. Presenter 请求 Interactor func 执行一些辅助工作,例如调用某些服务
  3. 服务执行一些 NSURLSession 请求并回调到 Interactor。

如果你对 VIPER 很熟悉,你可以看到很明显的队列我跳过了一些协议和 VIPER 元素扩展。

在上面的链接中我们有一个函数:

static func getPosts(completionHandler: @escaping ([Post]?, Error?) -> Void) {

如您所见,它不会在完成时返回原始响应,而是对数据和错误进行一些检查。

我的问题是这合法吗?我认为这违反了单一职责或至少违反了 VIPER。

检查错误的最佳位置是什么,将一些数据构建器注入到一个人发帖的服务函数中是否更好。

或者也许我们需要用原始响应回电,并允许演示者对错误、数据空等进行所有必要的检查。请不要阻止这个问题,因为这至少对于查看您的 cmets 很重要。

【问题讨论】:

    标签: ios swift viper viper-architecture


    【解决方案1】:

    对我来说还有一个问题是我不知道哪个元素负责处理响应。

    1. VIPER 仅说明单个模块所需的部件。它不会强制您的Interactor 直接依赖于Storage/Cache/NetworkClient。您还可以拥有其他实体,例如 Repository,这样您的依赖项就会变成 Interactor -> Repository -> NetworkClient。
    2. NetworkClient 可以传递数据或错误,这完全没问题。但是,在这种情况下提供Result<[Post], NetworkClientError> 会更快捷。

    在这种情况下,Interactor 可以处理与网络相关的错误。例如。 Interactor 可以决定重试几次,以防错误与互联网连接有关。

    【讨论】:

    • 是的,这对我来说是主要问题,感谢现实世界的例子,尝试重试!我应该将这样的逻辑保留在服务中或演示者中。
    • 酷!如果您认为答案解决了您的问题,请将其标记为“已接受”。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-24
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    • 2017-05-25
    • 2021-11-25
    • 2018-01-07
    相关资源
    最近更新 更多