У меня проблема с сохранением структуры в массив структур после получения из API.После завершения выборки данных JSON и использования завершения данные не могут быть добавлены в массив внутри блока завершения.Я искал пару дней, перепробовал много вещей и до сих пор не работает.
Вот код:
import UIKit
struct IndodaxApi:Decodable{
var ticker:dataStruct
}
struct dataStruct: Decodable {
var high:String
var low:String
var last:String
var vol_idr:String
var vol_btc:String
init(high:String, low:String, last:String, vol_idr:String, vol_btc:String) {
self.high = high
self.low = low
self.vol_idr = vol_idr
self.vol_btc = vol_btc
self.last = last
}
func printInfo() -> Void {
print("High:\(high)")
print("Low:\(low)")
print("Last:\(last)")
print("vol_idr:\(vol_idr)")
print("vol_btc:\(vol_btc)")
}
}
class data {
private let link:String
private let ticker:String
private let coinlist_idr:[String]
private var dataCoin:[dataStruct]
init() {
link = "https://indodax.com/api/"
ticker = "/ticker"
coinlist_idr = ["btc_idr"]
dataCoin = [dataStruct]()
}
public func getData() -> [dataStruct] {
dataCoin.removeAll()
load()
return dataCoin
}
Эта функция здесь означает добавление данных, возвращаемых из обработчика завершения, в массив dataCoin, который является структурой DataStruct:
private func load(){
var index = 0
let totalCoin = coinlist_idr.count
while(index<totalCoin){
fetchcoin(coinName: getNextCoin(index), completionHandler: { (data) in
self.dataCoin.append(data)
})
index+=1
}
}
Эта функциявот для получения данных из API и передачи в обработчик завершения:
public func fetchcoin(coinName:String, completionHandler: @escaping ((dataStruct)->Void)){
let urlLink = self.link + coinName + self.ticker;
let url = URL(string: urlLink)
URLSession.shared.dataTask(with: url!) { (data, response, err) in
guard let data = data else {return}
do {
let api = try JSONDecoder().decode(IndodaxApi.self, from: data)
DispatchQueue.main.async {
let returnData = dataStruct(high: api.ticker.high, low: api.ticker.low, last: api.ticker.last, vol_idr: api.ticker.vol_idr, vol_btc: api.ticker.vol_btc)
completionHandler(returnData)
}
}catch let jsonERR{
print(jsonERR)
}
}.resume()
}
private func getNextCoin(_ coinName:Int)->String{
return coinlist_idr[coinName]
}