gpt4 book ai didi

swift - 如何向 Moya.Response JSON 添加一个不在来自 http 响应的真实负载中的字段

转载 作者:行者123 更新时间:2023-11-28 08:07:47 24 4
gpt4 key购买 nike

如果我有:

import Moya
import RxSwift
import ObjectMapper
import Moya_ObjectMapper

provider.request(.callApi(id: id))
.mapObject(Thing.self)
.subscribeOn(ConcurrentDispatchQueueScheduler(qos: .background))
.observeOn(MainScheduler.instance)

...

struct Thing: Mappable, Equatable {

var id: String?

init?(map: Map) {
}

mutating func mapping(map: Map) {
id <- map["id"]
}

进行 http api 调用并返回 json,如 {"id: "123"},一切正常。使用正确的 ID 创建了一个新的 Thing 结构。但是如果我想向 Thing 添加“flavor”怎么办和硬编码 {"id: "123", "flavor": "something"}。

即让我们修改实际的 http 响应主体并在它到达 .mapObject 方法之前添加 "flavor": "something"。哪里是利用它的正确位置?

它不仅仅是将它添加到 Thing 中的映射函数,因为“某物”对于每个 id 都是不同的。可能是 flavor: "something1"然后是 flavor: "something2"。我在与 callApi(id: id) 相同的范围内拥有此值,因此类似:

provider.request(.callApi(id: id))
.addJSON("flavor", flavor)
.mapObject(Thing.self)
.subscribeOn(ConcurrentDispatchQueueScheduler(qos: .background))
.observeOn(MainScheduler.instance)

但是 .addJSON 是我刚刚编造的。它不存在。但是必须有一些简单的解决方案吗?

最佳答案

尝试修改实际的 JSON 感觉很脏,而且处于两个低级别。但我去过那里,所以如果它有效,我无法判断。 :)

我会通过创建 Moya_ObjectMapper 可用的特殊版本的 Moya.Response 扩展方法来解决这个问题。

public extension Response {

/// Maps data received from the signal into an object which implements the Mappable protocol.
/// If the conversion fails, the signal errors.
public func mapObject<T: BaseMappable>(_ type: T.Type, context: MapContext? = nil) throws -> T {
guard let object = Mapper<T>(context: context).map(JSONObject: try mapJSON()) else {
throw MoyaError.jsonMapping(self)
}
return object
}

我会添加一个类似的方法,但带有附加参数闭包 (T) -> (T)。所以它实际上会在执行另一个映射后返回映射对象,该映射将向其中添加您需要的任何必要信息。

关于swift - 如何向 Moya.Response JSON 添加一个不在来自 http 响应的真实负载中的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44616773/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com