我如何发送从 api?Swift 回答后收到的 orderId

How i can send orderId received after answering from api?Swift

我可以保存 orderId 并从磁盘中检索并发送第二个请求 来自基地的回答:

{"orderId" : 241,"fullName" : "Поесть"}

SearchResponse.swift

struct SearchResponse: Codable {

    var orderId: Int
    var fullName: String
    var retailId: Int

    private enum CodingKeys: String, CodingKey {
        case orderId
        case fullName
        case retailId
    }
}

在搜索请求后,我尝试在状态 == 200(service.swift):

中像这样将 orderId 保存在磁盘中
if let value = result.value {
    var code = 0;
    do {
        if let responseDictionary = try JSONSerialization.jsonObject(with: value.data, options: .allowFragments) as? [String:Any] {
            code = responseDictionary["status"] as? Int ?? 0;
        }

    } catch {
        if let e = try? JSONDecoder().decode(ErrorResponse.self, from: value.data) {
            observer.onError(e);
        }
    }
    if (value.response?.statusCode == 200) {
        do{

            let response = try JSONDecoder().decode(SearchResponse.self, from: value.data);
            try Disk.save(response.retailId, to: .caches, as: FileName.retailName);
            try Disk.save(response.orderId, to: .caches, as: FileName.orderId);


        } catch {
            if let e = try? JSONDecoder().decode(ErrorResponse.self, from: value.data) {
                observer.onError(e);
            }
        }
        observer.onNext(true)
    } else {
        if let e = try? JSONDecoder().decode(ErrorResponse.self, from: value.data) {
            observer.onError(e);
        }
    }
}

viewmodel.swift

private var orderId: String {
    let orderId = try? Disk.retrieve(FileName.orderId, from: .caches, as: SearchResponse.self).orderId
    return String(orderId!) <-- there error "Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value"
}

这不是一个完整的答案,但我认为作为一个答案来解释会更清楚。您不应该使用 try? 而是捕获任何错误并打印它们,并进一步避免强制展开。

private var orderId: String? {
    do {
        let orderId = try Disk.retrieve(FileName.orderId, from: .caches, as: SearchResponse.self).orderId
        return String(orderId)
    } catch {
        print(error)
    }
    return nil
}

现在,如果出现任何问题,您将在控制台上打印一条错误消息,或者如果没有发现任何问题,您将返回 nil,这将两个可能的问题区分开来。

保存到磁盘时,您的错误处理仅涉及 json 解码错误,因此您还需要 print/handle try Disk.save(... 产生的任何可能错误