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

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

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

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

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

解決済

1回答

216閲覧

Realmで指定行の上書き保存をしたい

sunglass

総合スコア303

Realm

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

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

0クリップ

投稿2020/05/03 05:51

Realmを使ってユーザーページを作りたい。
またその値を変更(上書き)できるようにしたいです。

UsersにプライマリーKeyを設定。
ローカルユーザー1人という設定でid==0の時に値を上書き保存しようとしてみました。

すると以下のエラーが出ます。
textFiledの値はボタン押下すると上書き自体はされます。

このエラーはどうすれば消えるのでしょうか。。

ViewController

1import UIKit 2import RealmSwift 3 4class ViewController: UIViewController,UITextFieldDelegate{ 5 6 @IBOutlet weak var label: UILabel! 7 @IBOutlet weak var textField: UITextField! 8 @IBOutlet weak var id: UILabel! 9 10 override func viewDidLoad() { 11 super.viewDidLoad() 12 13 let realm = try! Realm() 14 print(Realm.Configuration.defaultConfiguration.fileURL!) 15 let obj = realm.objects(Obj.self) 16 17 for objData in obj{ 18 label.text = objData.name 19 //id.text = objData.id 20 } 21 22 textField.delegate = self 23 } 24 25 func textFieldShouldReturn(_ textField: UITextField) -> Bool { 26 27 label.text = textField.text 28 textField.resignFirstResponder() 29 30 return true 31 } 32 33 @IBAction func saveButton(_ sender: UIButton) { 34 35 let obj = Obj() 36 obj.name = textField.text 37 label.text = obj.name 38 39 let realm = try! Realm() 40 41 42 DispatchQueue(label: "background").async { 43 autoreleasepool { 44 let realm = try! Realm() 45 let UserName = realm.objects(Obj.self).filter("id == 0").first 46 try! realm.write { 47 UserName!.name = self.label.text 48 } 49 } 50 } 51 52 } 53} 54 55 56

Users

1import Foundation 2import RealmSwift 3 4class Obj: Object{ 5 6 @objc dynamic var id = 0 7 @objc dynamic var name: String? 8 9 override static func primaryKey() -> String? { 10 return "id" 11 } 12} 13

イメージ説明
Realm Browserで確認した中身

エラー内容
UILabel.text must be used from main thread only

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

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

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

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

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

guest

回答1

0

ベストアンサー

warningの通り、UI部品に対するアクセスはmain threadで行う必要があります。

一次情報ではありませんが、上記の記述によれば

Updating UI on a thread other than the main thread is a common mistake that can result in missed UI updates, visual defects, data corruptions, and crashes.

とあります。

なので、

swift

1 DispatchQueue(label: "background").async {

swift

1 DispatchQueue.main.async {

のようにメインキューで処理する必要があるかと思います。

投稿2020/05/03 12:47

TsukubaDepot

総合スコア5086

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

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

sunglass

2020/05/04 03:40

解決できました。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問