前提
CoreMotion(CMPedmeter)で歩数の計測とデータベース(Realm)への保存をしています。
計測したものが画面に表示反映されるまでに時間がかかります。反映されるのに時間がかかるのは仕方ないのかなとは思うのですが、保存の方法がよくなくて、表示されている(きちんと歩数が反映されていない状態)数値がデータベースに保存されてしまいます。
どこを直せばいいかご教授いただけないでしょうか。
該当のソースコード
Swift
1 @IBAction func buttonStart(_ sender : Any) { 2 StartB.isHidden = true 3 StopB.isHidden = false 4 5 testManager.startUpdatingLocation() //位置情報取得 6 7 if (CMPedometer.isStepCountingAvailable()){ 8 pedometer.startUpdates(from: Date()) { data, error in 9 DispatchQueue.main.async(execute: { 10 if (data != nil && error == nil) { 11 12 let steps = data!.numberOfSteps //歩数 13 let resteps:String = String(format:"%d歩", steps.intValue) 14 15 self.label.text = "\(resteps)" 16 17 self.activitydata.resteps = Int(truncating: steps) 18 19 } 20 })//DispatchQueue.main.async 21 } 22 }//isStepCountingAvailable 23 } 24 @IBAction func buttonStopt(_ sender : Any) { 25 let alert = UIAlertController(title: "確認", message: "終了しますか?", preferredStyle: .alert) 26 let ok = UIAlertAction(title: "OK", style: .default) { (action) in 27 28 self.StartB.isHidden = true //非表示 29 self.StopB.isHidden = true //非表示 30 31 self.testManager.stopUpdatingLocation() 32 33 RealmMap.shared.create(self.activitydata) 34 35 36 self.pedometer.stopUpdates() 37 //モーダルに遷移 38 self.performSegue(withIdentifier: "ModalSegue", sender: nil) 39 40 } 41 //ここから追加 42 let cancel = UIAlertAction(title: "キャンセル", style: .cancel) { (acrion) in 43 self.dismiss(animated: true, completion: nil) 44 } 45 alert.addAction(cancel) 46 //ここまで追加 47 alert.addAction(ok) 48 present(alert, animated: true, completion: nil) 49 50 51 } 52 53 54 55 56 57 58 59 60class ActivityData: Object { 61 @objc dynamic var resteps = 0 62 } 63 64 65 66 67class RealmMap { 68 private init() {} 69 70 static let shared = RealmMap() 71 72 var realm = try! Realm() 73 74 func create<T: Object>(_ object: T) { 75 do { 76 try realm.write { 77 realm.add(object) 78 } 79 } catch { 80 print("realm create error: \(error)") 81 } 82 } 83 84 func delete<T: Object>(_ object: T) { 85 do { 86 try realm.write { 87 realm.delete(object) 88 } 89 } catch { 90 print("realm delete Error: \(error)") 91 } 92 } 93 94 95} 96 97
細かいところまで見られていないかもしれないですが、
DispatchQueue.main.asyncの中は、
self.label.textの設定だけにして、
それ以外の処理はDispatchQueue.main.asyncの中に入る前に事前に処理する感じにしてみたらどうでしょうか。
コードを見ると、スタートボタンをタップしたら歩数の計測を開始して、ストップボタンを押したら計測した歩数を保存しているように見えますが、歩数が得られていない状態(歩行を検知していない状態)でストップボタンを押した時に不正な値を保存してしまうのが問題だと言っているのでしょうか? であれば、歩数が得られていない状態でストップボタンを押せないようにすれば(またはストップボタンをhiddenにすれば)いいという話ではないのでしょうか? または、歩数が得られていなければ0歩を保存すればいいという話ではないのでしょうか?(今はデフォルト値の0歩が保存されるようになっているように見えます。)
あなたの回答
tips
プレビュー