Najprostsze poprawka-to utworzyć jeden do
blok, z którego wrócisz, jeśli wszystko będzie w porządku. I jeden blok catch, który się stanie, jeśli coś pójdzie nie tak. Trzeba także ustawić sygnaturę funkcji, aby zwracać opcjonalna wartość, tak jak w przypadku awarii u ciebie prawdopodobnie nie będzie 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
}
}
można również dzielić się bloki, więc każda próba jest w swoim własnym bloku, na przykład:
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
}
Można również podzielić dekodowanie danych na prywatnej funkcję i powrócić do połączenia tej funkcji:
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
}
}