Как я могу отправить заказ, полученный после ответа от API? - PullRequest
0 голосов
/ 26 мая 2019

Как я могу сохранить 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
    }
}

после поискового запроса я пытаюсь сохранить orderId на диске, как это в статусе == 200 (service.swift):

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"
}

1 Ответ

0 голосов
/ 26 мая 2019

Это не полный ответ, но я думаю, что яснее объяснить как ответ. Не следует использовать 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
}

Теперь вы получите сообщение об ошибке, напечатанное на консоли, если что-то пойдет не так, или вы вернете ноль, если ничего не было найдено, что разделяет две возможные проблемы.

При сохранении на диск обработка ошибок связана только с ошибками декодирования json, поэтому вам необходимо распечатать / обработать любые возможные ошибки, сгенерированные также из try Disk.save(...

...