初めまして。現在Swiftを勉強している初学者のマサと申します。
前提・実現したいこと
HealthKitから得られた歩数の情報をChartsを使用し、歩数をグラフに表示させたいと思っています。
しかし、HealthKitから歩数の値は取得できているものの、値が horizontaBarChartUpdate() 関数にきちんと渡されずいます。
ここできちんと、getValueSteps に値が入れば、グラフが表示できるのではと考えています。
プリントログで確認した所、先にhorizontaBarChartUpdate()が呼び出されている様にも見えますが、これはSwiftでの関数の呼び出しに順序などがあるのでしょうか?
お聞きしたい事
Q1. horizontaBarChartUpdate() 関数に値を渡す方法。
Q2. Swiftにおいて、特有の関数が呼び出される順序があれば、ヒントをお教え願えたら幸いです。
該当のソースコード
import UIKit import CoreMotion import HealthKit import Charts class ShowGraphTableViewController: UITableViewController { // ここに棒グラフを描く @IBOutlet weak var horizontalBarChart: HorizontalBarChartView! // HealthKit インスタンス生成 let healthStore = HKHealthStore() // 歩数受け取り用変数 //var getStepToday: Double! override func viewDidLoad() { super.viewDidLoad() getSteps() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } func getSteps() { // 初期化 var sendValueOfSteps: Double = 0.0 getTodaysSteps { (result) in DispatchQueue.main.async { sendValueOfSteps = result print("sendValueOfStep : (sendValueOfSteps)") } } horizontaBarChartUpdate(getValueSteps: sendValueOfSteps) } // 今日の歩数を取得するための関数 func getTodaysSteps(completion: @escaping (Double) -> Void) { // Returns the shared quantity type for the provided identifier. // 識別したデータを取得するために定義する。 let stepsQuantityType = HKQuantityType.quantityType(forIdentifier: .stepCount)! let now = Date() // スタート日付を設定する。 let startOfDay = Calendar.current.startOfDay(for: now) // Returns a predicate for samples whose start and end dates fall within the specified time interval. // 始めと終わりの日付を指定して、時間間隔内にあるサンプルのを返す。 let predicate = HKQuery.predicateForSamples(withStart: startOfDay, end: now, options: .strictStartDate) // A query that performs statistical calculations over a set of matching quantity samples, and returns the results. // マッチしたサンプル結果を返すクエリ。 // execute して結果を取得する。 let query = HKStatisticsQuery(quantityType: stepsQuantityType, quantitySamplePredicate: predicate, options: .cumulativeSum) { (_, result, error) in var resultCount = 0.0 guard let result = result else { print("Failed to fetch steps rate") completion(resultCount) return } if let sum = result.sumQuantity() { resultCount = sum.doubleValue(for: HKUnit.count()) print("resultCount (resultCount)") } DispatchQueue.main.async { completion(resultCount) } } //クエリの実行 healthStore.execute(query) } func horizontaBarChartUpdate (getValueSteps: Double) { // データの挿入 let entry1 = BarChartDataEntry(x: 1.0, y: getValueSteps) print("(entry1)") //データのセット let dataSet = BarChartDataSet(entries: [entry1], label: nil) let data = BarChartData(dataSets: [dataSet]) -省略- // チャートの表示 horizontalBarChart.data = data // Color の設定 dataSet.colors = ChartColorTemplates.vordiplom() } }
プリントログ結果
ChartDataEntry, x: 1.0, y 0.0 resultCount 89567.0 sendValueOfStep : 89567.0
補足情報(FW/ツールのバージョンなど)
Swift 5.0
Xcode Version 10.2.1
Charts (3.3.0)
以上です。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。