理解Realm,Moya和ObjectMapper

时间:2018-12-23 05:06:22

标签: ios swift realm objectmapper moya

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

我使用Moya向我的API发出请求。我使用Realm将返回的数据保留在本地数据库中。我使用ObjectMapper映射JSON对象以更正Realm变量。

但是,我现在遇到一个问题,即我不确定如何解码JSON响应以使其通过映射器。

这是我的Moya代码:

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'

MyResponse类如下所示:

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的解决方案,但出现了错误:

  

参数标签'(JSON :)'与任何可用的重载都不匹配

在线:

let myResponse = MyResponse(JSON: json)

1 个答案:

答案 0 :(得分:0)

之所以会出现此错误,是因为您正在使用Swift JSONDecoder进行解码,这需要您实现包装了Encodable和Decodable(JSON <-> YourObject)的Codable。

如果您使用的是Swift 4,则可以使用Codable而不是依赖于第三方库。

MyResponse将变为:

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

MyResponseData也应该实现Codable。

在此之后,您应该可以:

do {
    let data = try JSONDecoder().decode(MyResponse.self, from: response.data)
} catch let error { 
    // handle error
}