UPGRADE YOUR SKILLS: Learn advanced Swift and SwiftUI on Hacking with Swift+! >>

How can i append or assign the response_2 contents to response_1 contents so that I can display it o the tableView?

Forums > Swift

@meme  

is this a nested json?

request format: GET /trading-pairs :

[
  {
    "name": "ETH-KRW",
    "baseAsset": "ETH",
    "quoteAsset": "KRW"
  }, {
    "name": "BTC-KRW",
    "baseAsset": "BTC",
    "quoteAsset": "KRW"
  }, {
    "name": "BCH-KRW",
    "baseAsset": "BCH",
    "quoteAsset": "KRW"
  }
]

and then :

request format : GET /trading-pairs/{name}/ticker :

{
  "price": 10194500,
  "ask": 10195000,
  "bid": 10184500,
  "volume": 1752.05558316,
  "time": "2018-03-14T03:50:41.184Z"
}

I have been trying to parse json data in this format but result is unsuccessful so far how would it possible to parse data in such format?

Coders, devs, lets parse this json format.. . :)

           ===============What I Tried=============
  1. Response Models:

    import Foundation
    // MARK: - TradingPair
    @objcMembers class TradingPair: NSObject, Codable {
    var id: Int
    var name, baseAsset: String
    var quoteAsset: String
    
    //var pairs: TickerByPairs?
    
    init(id: Int, name: String, baseAsset: String, quoteAsset: String) {
        self.id = id
        self.name = name
        self.baseAsset = baseAsset
        self.quoteAsset = quoteAsset
    }
    }

    
    import Foundation

// MARK: - TickerByPairs @objcMembers class TickerByPairs: NSObject, Codable { var price, ask: Float var askVolume: Double var bid: Float var bidVolume, volume: Double var time: String

init(price: Float, ask: Float, askVolume: Double, bid: Float, bidVolume: Double, volume: Double, time: String) {
    self.price = price
    self.ask = ask
    self.askVolume = askVolume
    self.bid = bid
    self.bidVolume = bidVolume
    self.volume = volume
    self.time = time
}

}


 2. API request func s:

import Foundation import Alamofire import SwiftyJSON import PromiseKit import JSONDecoder_Keypath

class ServerCommunicator {

// using this: `static  var tradingPairs: String {
    return serverEndPoint + "/trading-pairs"`
}
static func getTradingPairs() -> Promise<[TradingPair]> {
    return Promise { seal in
        AF.request(API.tradingPairs, method: .get).validate().responseData { (data) in
            guard let data = data.value else {
                let err: Error =  Error.self as! Error
                seal.reject(err)
                return
            }
            guard let tradingPairs = try? JSONDecoder().decode([TradingPair].self, from: data) else {
                let err: Error = Error.self as! Error
                seal.reject(err)
                return
            }
            //dump(tradingPairs)
            dump(tradingPairs)
            seal.fulfill(tradingPairs)
        }
    }
}

// using this: static func getPairByTicker(pairName: String) -> String { return tradingPairs + "/\(pairName)" + "/ticker" } static func getPairByTicker(pairName: String = "") -> Promise<TickerByPairs> { let decoder = JSONDecoder() return Promise { seal in AF.request(API.getPairByTicker(pairName: pairName), method: .get).responseDecodable(of: TickerByPairs.self, decoder: decoder) { response in // dump(response.value) switch response.result { case .success(let suc): return seal.fulfill(suc) case .failure(let err): return seal.reject(err) } } } } }


 3. ViewController class: 

import UIKit import Alamofire

class ViewController: UIViewController { @IBOutlet weak var tableView: UITableView! var tradingPair: [TradingPair]? var tickerByPair:[TickerByPairs]?

override func viewDidLoad() {
    super.viewDidLoad()
    getTradingPairs()
}
func refresh(data: [TradingPair]) {
    self.tradingPair = data
    self.tableView.reloadData()
}

func getTradingPairs() {
    print("api call")
    ServerCommunicator.getTradingPairs().done{ response_1 -> Void in
        print(response_1)
        for keypathValue in response_1 {
            ServerCommunicator.getPairByTicker(pairName: keypathValue.name).done{ response_2 -> Void in
                print(response_2)
            }.catch{(err) in
                print(err)
            }
        }
    }.catch{(err) in
        print(err)
    }
}

} extension ViewController: UITableViewDataSource { func numberOfSections(in tableView: UITableView) -> Int { return 1 } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { guard let data = self.tradingPair else { print("data is empty") return 0 } return data.count

}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "TradingPairCell") as! TradingPairCell
    guard let data = self.tradingPair else {
        print("again empty")
        return cell
    }

    let price = self.tickerByPair![indexPath.row].price
    let volume = self.tickerByPair![indexPath.row].volume

    cell.price.text = String(describing: price)
    cell.volume.text = String(describing: volume)

    cell.configure(data: data[indexPath.row])
    return cell
}

}

extension ViewController: UITableViewDelegate { func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return 44 } }


 1. Cell Class

class TradingPairCell: UITableViewCell { @IBOutlet weak var name: UILabel! @IBOutlet weak var price: UILabel! @IBOutlet weak var volume: UILabel! //var pairByTicker: PairByTicker?

func configure(data: TradingPair) {

    self.name.text = data.name

// self.price.text = data.baseAsset // self.volume.text = data.quoteAsset } }

 II. This is what i get in console:

api call data is empty data is empty

=====Response_1=====[<Test.TradingPair: 0x600003521cc0>,[<Test.TradingPair: 0x600003521cc0>,[<Test.TradingPair: 0x600003521cc0>,[<Test.TradingPair: 0x600003521cc0>,[<Test.TradingPair: 0x600003521cc0>,[<Test.TradingPair: 0x600003521cc0>,[<Test.TradingPair: 0x600003521cc0>,[<Test.TradingPair: 0x600003521cc0>,[<Test.TradingPair: 0x600003521cc0> .. .. . =====Response_2=====<Test.TickerByPairs: 0x600000c78640>=====Response_2===== =====Response_2=====<GoPaxTest.TickerByPairs: 0x600000c78640>=====Response_2===== =====Response_2=====<GoPaxTest.TickerByPairs: 0x600000c78640>=====Response_2===== =====Response_2=====<GoPaxTest.TickerByPairs: 0x600000c78640>=====Response_2=====.. .. .. .. ..

2      

Hacking with Swift is sponsored by Essential Developer

SPONSORED Join a FREE crash course for mid/senior iOS devs who want to achieve an expert level of technical and practical skills – it’s the fast track to being a complete senior developer! Hurry up because it'll be available only until April 28th.

Click to save your free spot now

Sponsor Hacking with Swift and reach the world's largest Swift community!

Archived topic

This topic has been closed due to inactivity, so you can't reply. Please create a new topic if you need to.

All interactions here are governed by our code of conduct.

 
Unknown user

You are not logged in

Log in or create account
 

Link copied to your pasteboard.