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

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

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

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

Xcode

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

Swift

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

Q&A

解決済

1回答

1272閲覧

swift realm でアンマネージドオブジェクトだと思われるのに'Realm accessed from incorrect thread.'

umeme1011

総合スコア16

Realm

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

Xcode

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

Swift

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

0グッド

0クリップ

投稿2019/08/17 18:07

編集2019/08/17 23:37

Xcode 10.2.1
swift 5
realm
で某ゲームのスコア管理アプリを勉強がてら作っています。初心者です。

スコアの同期(サイトからデータ取得、DB登録)を、別スレッドで行っています。

あるテーブルのデータを全件削除したのち、登録しているのですが
2回目の同期実行時にクラッシュします。(1回目は成功します)

DB保存箇所のコードは以下です。

Swift

1 // MyStatus TBL 保存 2 func saveMyStatus() { 3 print("saveMyStatus Start") 4 5 // 現在日時 6 let now = Date() 7 // スコア用realm 8 let documentDir: NSString 9 = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as NSString 10 let scoreRealmPath = documentDir.appendingPathComponent("(Const.Realm.scoreFileName).realm") 11 let scoreRealm = try? Realm(fileURL: URL(fileURLWithPath: scoreRealmPath)) 12 13 // 全件取得 14 let realm = MyRealm() 15 let result = realm.getAllMyStatus() 16 17 let objectRef = ThreadSafeReference(to: result) 18 guard let object = scoreRealm?.resolve(objectRef) else { return } 19 20 try? scoreRealm?.write { 21 22 if !result.isEmpty { 23 scoreRealm?.delete(object) // ←ここはスレッドセーフ 24 } 25 26 for myStatus in self.myStatuses { 27 myStatus.createDate = now // ← ここで'Realm accessed from incorrect thread.'で落ちます 28 myStatus.createUser = Const.Realm.SYSTEM 29 myStatus.updateDate = now 30 myStatus.updateUser = Const.Realm.SYSTEM 31 myStatus.save(scoreRealmPath: scoreRealmPath) 32 } 33 } 34 35 print("saveMyStatus End") 36 } 37

以下のエラーがでます。

2019-08-18 02:41:02.881612+0900 SM[57751:2436393] *** Terminating app due to uncaught exception 'RLMException', reason: 'Realm accessed from incorrect thread.'

色々調べ、以下のサイトを読んでみたりしましたが原因がわかりません・・
RealmSwift入門 – 覚えておきたい、リレーションの定義からクエリ、マイグレーションまで –
[Realm][Swift4対応 完全保存版] 5.データの更新と削除

初心者で至らないところも多々あるかと思いますが
よろしくお願いいたします。

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

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

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

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

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

umeme1011

2019/08/17 23:38

ご指摘ありがとうございます。 リンクを修正しました。
guest

回答1

0

ベストアンサー

別スレッドからではアクセスできないようです。
以下のページで紹介されているように,保存を別スレッドで行う場合は専用のスレッドを用意する必要がありそうです。

Realm accessed from incorrect thread.

投稿2019/08/18 02:26

fathy

総合スコア254

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

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

umeme1011

2019/08/26 16:23

ご回答ありがとうございます。 迷宮入りし、根本的にロジックを変更し解決しました。 おそらくですが、「self.myStatuses」変数をメインスレッドで宣言していたため 別スレッドでアクセスできなかったのではないかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問