D22 - 用 Swift 和公开资讯,打造投资理财的 Apps { 台股成交量实作.2 }

上一篇在 TwMarketTradingInfoManager 完成了拿取大盘成交量的 API,接下来,在原来的大盘 K 线页的 Model,加上拿取大盘成交量功能的 API。命名为 func requestTwVolumeInfo()


    var twExStockDataSet = [StockKLine]()
    
    var twExVolumeDataSet = [TwMarketTradingInfo]() //

// MARK: - 给外部呼叫的 func
    /// 会取这个月和前一个月台股加权指的 KLine data,单一个月,有可能 k 棒数量太少
    func requestTwExKLineAndVolumeInfo() {
        
        requestTwExKLineInfo()
        requestTwVolumeInfo()
    }

// MARK: - 拿大盘量
    private func requestTwVolumeInfo() {
        requestTwThisMonthVolumeInfo()
        requestTwLastMonthVolumeInfo()
    }
    
    private func requestTwThisMonthVolumeInfo() {
        
        let date = dateUtility.getStartOfMonth()
        volumeManager.requestTwMarketDailyTradingInfo(date: date) { [weak self] volumeList, error in
            
            self?.update(volumeList: volumeList)
            self?.delegate?.didRecieveVolume(volumeDataSet: volumeList, error: error)
        }
    }
    
    private func requestTwLastMonthVolumeInfo() {
        
        let date = dateUtility.getLastMonthStartDate()
        volumeManager.requestTwMarketDailyTradingInfo(date: date) { [weak self] volumeList, error in
            self?.update(volumeList: volumeList)
            self?.delegate?.didRecieveVolume(volumeDataSet: volumeList, error: error)
        }
    }
    
    private func requestTwBefore2MonthVolumeInfo() {
        
        let date = dateUtility.getMonthStartDate(date: Date(), add: -2)
        volumeManager.requestTwMarketDailyTradingInfo(date: date) { [weak self] volumeList, error in
            self?.update(volumeList: volumeList)
            self?.delegate?.didRecieveVolume(volumeDataSet: volumeList, error: error)
        }
    }

    private func update(volumeList: [TwMarketTradingInfo]) {
        
        let updatedData = Set(self.twExVolumeDataSet + volumeList)
        self.twExVolumeDataSet = Array(updatedData).sorted { $0.date.timeIntervalSince1970 < $1.date.timeIntervalSince1970 }
    }

完成後,加上 delegate func 告诉 VC 有值的变化

protocol TwStockMarketKLineModelDelegate: AnyObject {
    
    func didRecieveTaiEx(kLineDataSet: [StockKLine], error: Error?)
    func didRecieveVolume(volumeDataSet: [TwMarketTradingInfo], error: Error?)
}

TwStockMarketKLineViewController 要补上新加的 delegate func

extension TwStockMarketKLineViewController: TwStockMarketKLineModelDelegate {
    
    func didRecieveVolume(volumeDataSet: [TwMarketTradingInfo], error: Error?) {
        print(model.twExVolumeDataSet)
    }
    
    func didRecieveTaiEx(kLineDataSet: [StockKLine], error: Error?) {
        
        print(model.twExStockDataSet)
    }
}

KLineViewController 也要加上 volumnDataSet 让外部传入。

var volumnDataSet = [TwMarketTradingInfo]()

然後在把 KLineVC 推进来的时候,要一起把加权指数的值传下去。

@IBAction func pushKLineButtonDidTap(_ sender: Any) {
        
        let storyboard = UIStoryboard(name: "KLine", bundle: nil)
        if let vc = storyboard.instantiateViewController(withIdentifier: "KLineViewController") as? KLineViewController {
            
            vc.kLineDataSet = model.twExStockDataSet
            vc.volumnDataSet = model.twExVolumeDataSet //前几篇没有这个值
            navigationController?.pushViewController(vc, animated: true)
        }
    }

然後,就可以准备在 KLineViewController 中画上量的图了。


<<:  DAY20 - 终於榨不出汁(文章) 了

>>:  [Day30] 终於来到了这一天 ~ 第二次铁人赛完赛心得 && 梳理学习顺序

JS 属性列举与原型的关系 DAY70

属性列举与原型的关系 自订原型 与 原生原型 最大的不同是在可列举(enumerable)的部分 原...

JavaScript Day08 - 物件

物件(object) 参考此篇:Day12 - 物件 建立空的物件,有2种方法 使用 new Obj...

DAY22: 为甚麽要模组化?

今天要讲解的是模组化的重要性,我在上学期修一门网页程序设计, 在学期末需要作出实体网页时,所有的程序...

Day17:终於要进去新手村了-Javascript-回圈-while简单举例练习

今天看了彭彭老师的影片,他使用了程序码做举例,这篇我会使用他举例的程序,再另外加上自己笔记让印象加深...

[Day - 28] - 运用Spring MockMvc 迈向自动化测试之路

Abstract 小编先前每个范例都有提供服务(Service)层级的测试案例,但部分开发者会开发许...