Cel mai simplu fix este de a crea unul do
bloc, de la care te întorci dacă totul este în regulă. Și un bloc catch care se va întâmpla dacă ceva nu este în regulă. Aveți, de asemenea, pentru a regla funcția semnătura pentru a reveni valoare opțională, deoarece în caz de eșec, probabil, nu va avea o TransactionsClassAModel
:
func myFunc() async -> TransactionsClassAModel? {
let url = URL(string: "...")
do {
let undecodedData = try await networkingTools.afRequest(url: url!)
let decodedData = try JSONDecoder().decode(TransactionsClassAModel.self, from: undecodedData)
/* do anything you need */
return decodedData // success
} catch {
print(error)
return nil // no object in this case
}
}
puteți, de asemenea, blocuri separate, astfel încât fiecare încercare este în propriul său bloc, de exemplu:
func myFunc() async -> TransactionsClassAModel? {
let url = URL(string: "...")
var undecodedData: Data // or optional Data? if function can return nil
do {
let undecodedData = try await networkingTools.afRequest(url: url!)
} catch {
print("Failed in afReqest: \(error)")
return nil
}
var decodedData: TransactionClassModel?
do {
decodedData = try JSONDecoder().decode(TransactionsClassAModel.self, from: undecodedData)
} catch {
print("Failed in decode: \(error)")
return nil
}
return decodedData
}
Puteți, de asemenea, separate de decodare a datelor în funcție privată, și a reveni pe funcția de apel:
private func decodeMyData(_ undecodedData; Data) -> TransactionsClassAModel? {
do {
return try JSONDecoder().decode(TransactionsClassAModel.self, from: undecodedData)
} catch {
print("Failed in decode: \(error)")
return nil
}
}
func myFunc() async -> TransactionsClassAModel? {
let url = URL(string: "...")
do {
let undecodedData = try await networkingTools.afRequest(url: url!)
return decodeMyData(undecodedData)
} catch {
print("Failed in afReqest: \(error)")
return nil
}
}