данные завершения не добавляют глобальный массив после извлечения из JSON (swift 4) - PullRequest
0 голосов
/ 24 ноября 2018

У меня проблема с сохранением структуры в массив структур после получения из 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]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...