微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Kotlin Multiplatform Mobile:如何处理 iOS 中的错误网络、数据库等?

如何解决Kotlin Multiplatform Mobile:如何处理 iOS 中的错误网络、数据库等?

我有这个功能可以发出网络请求并将结果写入 sqlDelight 数据库

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

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

就我而言,错误类型只有 1 个可见属性 - localizedDescription。如果我投射到 NSError,那么我可以获得更多可见的字段,但它们都没有任何帮助。

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

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

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

在 iOS 和 Android 中处理网络错误或在多平台项目中从共享模块抛出的任何错误/异常的最佳做法是什么?

解决方法

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

类似的东西:

shared/MyPresenter.kt

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

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

一个很好的指导项目是:https://github.com/jarroyoesp/KotlinMultiPlatform

,

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。