我如何发送从 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(...
产生的任何可能错误
我可以保存 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(...
产生的任何可能错误