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

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

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

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

Swift

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

Q&A

解決済

1回答

2263閲覧

'Realm accessed from incorrect thread.'の修正

oimo999

総合スコア3

Xcode

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

Swift

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

0グッド

0クリップ

投稿2020/05/24 11:53

前提・実現したいこと

初めてのIOSアプリ開発をしております。
Realmのデータ取得時にエラーが発生してしまうのを解決したいです。

発生している問題・エラーメッセージ

'Realm accessed from incorrect thread.'

該当のソースコード

swift

1import UIKit 2import RealmSwift 3 4class AddMorningTextViewController : UIViewController, UITextFieldDelegate { 5 6 7 @IBOutlet weak var dateLabel: UILabel! 8 @IBOutlet weak var appreciationText1: UITextField! 9 @IBOutlet weak var appreciationText2: UITextField! 10 @IBOutlet weak var appreciationText3: UITextField! 11 12 @IBOutlet weak var makeGoodText1: UITextField! 13 @IBOutlet weak var makeGoodText2: UITextField! 14 @IBOutlet weak var makeGoodText3: UITextField! 15 16 var dateResult = "" 17 18 19 override func viewDidLoad() { 20 super.viewDidLoad() 21 22 dateLabel.text = dateResult 23 appreciationText1.delegate = self 24 appreciationText2.delegate = self 25 appreciationText3.delegate = self 26 makeGoodText1.delegate = self 27 makeGoodText2.delegate = self 28 makeGoodText3.delegate = self 29 } 30 31 func textFieldShouldReturn(_ textField: UITextField) -> Bool { 32 self.view.endEditing(true) 33 return true 34 } 35 36 override func viewWillAppear(_ animated: Bool) { 37 DispatchQueue(label: "background").async { 38 let realm = try! Realm() 39 40 if let savedMorningTextData = realm.objects(MorningTextData.self).filter("date == '(self.dateResult)'").last { 41 42 DispatchQueue.main.async { 43 44 self.appreciationText1.text = savedMorningTextData.appreciationTextData1 45 self.appreciationText2.text = savedMorningTextData.appreciationTextData2 46 self.appreciationText3.text = savedMorningTextData.appreciationTextData3 47 self.makeGoodText1.text = savedMorningTextData.makeGoodTextData1 48 self.makeGoodText2.text = savedMorningTextData.makeGoodTextData2 49 self.makeGoodText3.text = savedMorningTextData.makeGoodTextData3 50 51 } 52 } 53 } 54 } 55 56 57@IBAction func morningTextSaveButton(_ sender: UIButton) { 58 let title = "朝の日記の保存" 59 let message = "朝の日記が保存されました" 60 let okText = "OK" 61 62 let alert = UIAlertController(title: title, message: message, preferredStyle: UIAlertController.Style.alert) 63 let okayButton = UIAlertAction(title: okText, style: UIAlertAction.Style.cancel, handler: nil) 64 alert.addAction(okayButton) 65 66 present(alert, animated: true, completion: nil) 67 68 let realm = try! Realm() 69 print(Realm.Configuration.defaultConfiguration.fileURL!) 70 let addMorningText = MorningTextData() 71 addMorningText.date = dateResult 72 addMorningText.appreciationTextData1 = appreciationText1.text ?? "" 73 addMorningText.appreciationTextData2 = appreciationText2.text ?? "" 74 addMorningText.appreciationTextData3 = appreciationText3.text ?? "" 75 addMorningText.makeGoodTextData1 = makeGoodText1.text ?? "" 76 addMorningText.makeGoodTextData2 = makeGoodText2.text ?? "" 77 addMorningText.makeGoodTextData3 = makeGoodText3.text ?? "" 78 79 try! realm.write() { 80 realm.add(addMorningText, update: .all) 81 } 82} 83} 84 85 86 87

swift

1 2import Foundation 3import RealmSwift 4 5class MorningTextData: Object{ 6 @objc dynamic var date: String = "" 7 @objc dynamic var appreciationTextData1 = "" 8 @objc dynamic var appreciationTextData2 = "" 9 @objc dynamic var appreciationTextData3 = "" 10 11 @objc dynamic var makeGoodTextData1 = "" 12 @objc dynamic var makeGoodTextData2 = "" 13 @objc dynamic var makeGoodTextData3 = "" 14 15 override static func primaryKey() -> String? { 16 return "date" 17 } 18 19} 20

試したこと

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

試していないので推測が含まれますが、マネージドオブジェクトがスレッドを跨いでいるのが原因だと思われます。

これを防ぐには、単一スレッド内でアクセスするか、あるいは下記のようにマネージドオブジェクトをスレッドセーフ(という言い方が正しいかわかりませんが)にする必要がありそうです。

投稿2020/05/24 12:29

TsukubaDepot

総合スコア5086

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問