質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

0回答

174閲覧

Swift CoreMotion データベース(Realm)正しく反映された数値が保存できない

AyatakaN

総合スコア0

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2022/06/24 02:55

前提

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/06/24 04:26

細かいところまで見られていないかもしれないですが、 DispatchQueue.main.asyncの中は、 self.label.textの設定だけにして、 それ以外の処理はDispatchQueue.main.asyncの中に入る前に事前に処理する感じにしてみたらどうでしょうか。
TakeOne

2022/06/25 00:44 編集

コードを見ると、スタートボタンをタップしたら歩数の計測を開始して、ストップボタンを押したら計測した歩数を保存しているように見えますが、歩数が得られていない状態(歩行を検知していない状態)でストップボタンを押した時に不正な値を保存してしまうのが問題だと言っているのでしょうか? であれば、歩数が得られていない状態でストップボタンを押せないようにすれば(またはストップボタンをhiddenにすれば)いいという話ではないのでしょうか? または、歩数が得られていなければ0歩を保存すればいいという話ではないのでしょうか?(今はデフォルト値の0歩が保存されるようになっているように見えます。)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問