【问题标题】:Kotlin Multiplatform Mobile: How to handle errors (network, db, etc.) in iOS?Kotlin Multiplatform Mobile:如何处理 iOS 中的错误(网络、数据库等)?
【发布时间】:2021-04-06 11:41:17
【问题描述】:

我有这个函数可以发出网络请求并将结果写入 SQLDelight 数据库:

@Throws(Exception::class)
suspend fun updateData()

在 Xcode 的 iOS 项目中,我看到这个函数被翻译成一个带有 completionHandler 类型为 (KotlinUnit?, Error?) -> Void 的函数。

在我的例子中,错误类型只有 1 个可见属性 - localizedDescription。如果我转换为NSError,那么我可以获得更多可见字段,但它们都没有任何帮助。

我在日志中看到Ktor http 客户端中的每个错误在 Swift 中都被抛出为Error。这使得很难知道引发了什么样的错误。

我希望能够查看错误类型并在某些情况下做出不同的反应。例如,如果是网络不可用错误,显示我的自定义错误文本和翻译,或者如果是 401 错误将用户发送到身份验证页面,500 显示一些其他文本等。

对于 Android 应用程序,我想我可以只转发这些异常,并且仍然能够键入检查或访问有关错误的更多数据。但我不知道如何为 iOS 应用程序做些什么。理想情况下,该解决方案应该在两个平台上都运行良好。

在 iOS 和 Android 中处理网络错误或从多平台项目中的共享模块引发的一般任何错误/异常的最佳实践是什么?

【问题讨论】:

  • 也许 this 文档页面与此处相关?
  • 设法找到解决方案?我也遇到了和你一样的问题
  • 这个问题被低估了,有人找到解决方案了吗?这才是真正的痛苦!

标签: android ios error-handling kotlin-multiplatform kotlin-native


【解决方案1】:

您可以使用MVP 架构并让Presenter 组件处理这些错误,它只是指示视图去哪里。

类似的东西:

shared/MyPresenter.kt

// ...
when (throwable) {
    is Unauthorized -> {
        view?.showInvalidCredentials()
    }
    is Conflict -> {
        view?.showConflictAccount()
    }
    else -> {
        view?.showError(throwable)
    }                    
}

通过这种方法,您将从平台视图中移除该责任。

一个可以作为指导的好项目是:https://github.com/jarroyoesp/KotlinMultiPlatform

【讨论】:

    【解决方案2】:

    您可以将网络层中的响应映射到Result。通常结果的数据建模是特定于您的应用程序的,因此可以通过使用泛型或密封类来包含加载/错误/结果的某种组合。

    您也可以使用Result type in the kotlin standard library

    【讨论】:

      猜你喜欢
      • 2022-12-30
      • 2021-02-06
      • 2017-12-21
      • 2023-01-30
      • 2022-11-23
      • 2021-05-01
      • 1970-01-01
      • 2021-06-25
      • 1970-01-01
      相关资源
      最近更新 更多