当前位置: 首页 > 知识库问答 >
问题:

理解Realm,Moya和ObjectMapper

樊令秋
2023-03-14

所以我试图弄清楚如何使用Realm,Moya和ObjectMapper。

我使用Moya向我的API发出请求。我使用Realm将返回的数据保存在本地数据库中。并且我使用ObjectMapper将JSON对象映射到校正领域变量。

然而,现在我遇到了一个问题,我不确定如何解码JSON响应以便将其通过映射器。

下面是我的莫亚密码:

provider.request(.signIn(email: email, password: password)) { result in
    switch result {
    case let .success(response):
        do {
            // Get the response data
            let data = try JSONDecoder().decode(MyResponse.self, from: response.data)

            // Get the response status code
            let statusCode = response.statusCode

            // Check the status code
            if (statusCode == 200) {
                // Do stuff
            }
        } catch {
            print(error)
        }
    case let .failure(error):
        print(error)
        break
    }
}

错误发生在这一行:

In argument type 'MyResponse.Type', 'MyResponse' does not conform to expected type 'Decodable'

类如下所示:

class MyResponse: Object, Mappable {
    @objc dynamic var success = false
    @objc dynamic var data: MyResponseData? = nil

    required convenience init?(map: Map) {
        self.init()
    }

    func mapping(map: Map) {

    }
}

我明白为什么我会犯这个错误,但我不知道正确的解决方法。我是不是在上面某个框架的文档中遗漏了什么?我这样做完全错了吗?我应该如何修复我的代码行?

我尝试了@kamran's的解决方案,但我得到了一个错误:

null

在线上:

let myResponse = MyResponse(JSON: json)

共有1个答案

水麒
2023-03-14

出现该错误是因为您正在使用Swift JSONDecoder进行解码,它要求您实现Codable,Codable包装了Encodable和Decodable(JSON<-&>YourObject)。

如果你正在使用Swift4,你可以使用Codable而不是依赖于第三方库。

我的回应将变成:

class MyResponse: Codable {
    let success: Bool
    let data: MyResponseData? 
}

MyResponseData也应该实现可编码。

在此之后,您应该能够执行以下操作:

do {
    let data = try JSONDecoder().decode(MyResponse.self, from: response.data)
} catch let error { 
    // handle error
}
 类似资料:
  • Moya 是你的 app 中缺失的网络层。不用再去想在哪儿(或者如何)安放网络请求,Moya 替你管理。 Moya有几个比较好的特性: 编译时检查正确的API端点访问. 使你定义不同端点枚举值对应相应的用途更加明晰. 提高测试地位从而使单元测试更加容易.

  • 我们在我们的项目中实现了Moya,RxSwift和Alamofire作为pod。 有人知道你是如何使用这种技术来控制每个url请求的缓存策略的吗? 我已经阅读了Moya的GitHub页面上的许多问题,但仍然没有发现任何问题。还尝试使用存储为sampleData文件的实际json响应,如下所示: null

  • 我在使用RxJava concat运算符时遇到了一个问题。我有两个可观察项,第一个从服务器数据库发出结果,另一个从本地数据库发出结果,然后我将: 因此,这给我带来了问题,因为我没有使用连接的observable是在上运行的,这不运行远程,它启动了。 如果我实现了,我将从不正确的线程获得上访问,因为Observable当然不在存在领域实例的线程上运行。 我已经搜索了其他问题,但没有得到任何有用的信息

  • Realm 是一个移动数据库,可运行于手机、平板和可穿戴设备之上。可以让你的应用更快速,带来难以想象的体验。其目标是为了代替 CoreData 和 SQLite 数据库。 目前支持 iOS/OS X/Android 平台,提供 Swift/Objective-C/Java 语言的 API: // Optional: turn off persistenceRLMRealm.useInMemoryD

  • Realm is a mobile database that runs directly inside phones, tablets or wearables.This repository holds the source code for the Java version of Realm, which currently runs only on Android. Realm Kotli

  • 一个用于Stetho的Realm模块:可以通过Stetho,在Chrome浏览器上查看Realm数据库。 使用方法: 1. 在您的build.gradle文件中添加: repositories {    maven { url "https://jitpack.io" }}dependencies {    compile 'com.facebook.stetho:stetho:1.5.0'