🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Realm

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

Swift

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

Q&A

解決済

1回答

1135閲覧

swift/Realm realmの更新処理が、なぜかループする

Ami_hamu

総合スコア4

Realm

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

Swift

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

0グッド

0クリップ

投稿2020/12/14 18:13

編集2020/12/14 18:20

Realm内のデータを更新したいです。

<環境>
Xcode 12.2
Swift 4
Realm 10.0.1

Realm のtable内はこんな感じです。Table名をInventory。その中のitemをprimary key として設定しています。
イメージ説明

updateボタンを押した際に、画面にある1の値をinventory tableのquantityの値から引き算したい。
イメージ説明
そこで、以下のようなコードを書きました。

Swift4

1@IBAction func Update(_ sender: Any) { 2     print("while外だよ") 3 var index = 1 4 while index > 0 { 5 print("while内にいるよ") 6 let item = itemLabel.text! 7 let quanti_num_int : Int? = Int(quantity.text!) 8 let realm = try! Realm() 9 10 let consumption = Inventory() 11 consumption.item = item 12 consumption.quantity = quanti_num_int! 13 14 //item(Apple)がinventory内にあれば、itemのquantity を新しいデータとして更新する。 15 if realm.object(ofType: Inventory.self, forPrimaryKey: consumption.item) != nil { 16 let toBeUpdatedRecords = realm.objects(Inventory.self).filter("item = '(item)'") 17 print(toBeUpdatedRecords) 18 try! realm.write { 19 for element in toBeUpdatedRecords{ 20 let exnum = element.quantity 21 print(exnum) 22 let nownum = quanti_num_int! 23 print(nownum) 24 element.quantity = exnum - nownum 25 print(element.quantity) 26 } 27 } 28 //なければAlertだす。 29 } else { 30 print("Alert") 31 } 32 index = index - 1 33 } 34 }

結果inventoryをみるとquantityの数は3-1=2になるはずが、1になってしまっています。
イメージ説明
またterminal 内で実装結果を確認すると、なぜかボタン内の処理全体が2回ループしています。なぜなら"while外だよ"が2回でているからです!

terminal

1while外だよ 2while内にいるよ 32020-12-14 11:59:32.931839-0600 Vision+ML Example[9157:361291] Version 10.4.0 of Realm is now available: https://github.com/realm/realm-cocoa/blob/v10.4.0/CHANGELOG.md 4Results<Inventory> <0x7f93fa81f460> ( 5 [0] Inventory { 6 item = Apple; 7 quantity = 3; 8 date = 2020-12-13 20:01:56 +0000; 9 } 10) 113 121 132 14while外だよ 15while内にいるよ 16Results<Inventory> <0x7f93f8c3bd10> ( 17 [0] Inventory { 18 item = Apple; 19 quantity = 2; 20 date = 2020-12-13 20:01:56 +0000; 21 } 22) 232 241 251

while loopを付けても,付けなくても、ループしてしまいます。しかもこのループの回数は、いつもランダムです。このボタンを一回押しただけで、2回も、3回も、ときには、8回もループしてしまうのは何故でしょうか。教えてください!

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

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

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

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

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

guest

回答1

0

ベストアンサー

「while外だよ」が複数回呼ばれているのであれば@IBAction func Update(_ sender: Any)が複数回呼ばれているので可能性としてはUpdateの紐付け方が何かしら間違っているのではないでしょうか?
(例えばTouchUpInside以外になっているとか。)

複雑になっていそうで原因がわからなさそうであれば、一度ボタンを削除してから紐付け直してみても良いかもしれません。

またはプロジェクト全体が見れる状態になればその部分も含めて解析することは可能かと思います。(コードをGithubにあげていただくなど)

以上、よろしくお願いいたします。

投稿2020/12/15 14:17

razuma

総合スコア1313

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

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

Ami_hamu

2020/12/19 16:34

TouchUpInsideにしてました????ボタンの紐付け方で、ループしてしまう場合があるとは知りませんでした。ボタンの紐付け方について勉強してきます。解決して頂きありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問