2017-01-12 7 views
6

swine 2.2からmine OS Xアプリケーションをswift 3.0に移行した後(領域のバージョンも1.0.2から2.1.1に変更されました)例外: "書き込みトランザクション中に非同期クエリを作成できません"。しかし、移行前にうまくいきました。"書き込みトランザクション中に非同期クエリを作成できません"例外

let realm = try Realm() 
let allMessages = realm.objects(Message.self) 
let messages = allMessages.filter("(state == 1) AND (dateSent <= %@)", dateSent) 
try realm.write ({ 
    messages.forEach { message in message.state = .seen } 
}) 

トランザクションの開始時に、例外がスローされます。なぜこれが起こっているのですか?どうすれば修正できますか?

+0

クエリをトランザクション – EpicPandaForce

答えて

0

forEachmessagesが変異しているようですが、これがクラッシュの原因になっている可能性があります。あなたは、メモリ上のすべてのメッセージをロードしますが、動作するはずですので、

let realm = try Realm() 
let allMessages = realm.objects(Message.self) 
let results = allMessages.filter("(state == 1) AND (dateSent <= %@)", dateSent) 
let messages = Array(results) 
try realm.write ({ 
    messages.forEach { message in message.state = .seen } 
}) 

は、おそらくそれは、最善の解決策ではありません。

はこのような何かを試してみてください。

0

私はトランザクションにクエリを移動する必要があると思います。

let realm = try Realm() 
try realm.write ({ 
    let allMessages = realm.objects(Message.self) 
    let messages = allMessages.filter("(state == 1) AND (dateSent <= %@)", dateSent) 
    messages.forEach { message in message.state = .seen } 
}) 
2

は私のコードでも同じ問題に直面していた、そしてそれは始まる書き込みトランザクションが順番に新しいRLMResultsを作成し、Iを意味し、それに通知ブロックを追加したコレクション通知をトリガされたことが判明しました書き込みトランザクションとクラッシュの内部でaddNotificationBlockを呼び出していました。

再現できる場合は、例外がスローされたresults.cpp - void Results::prepare_async()にブレークポイントを設定し、コードで何をしようとしているのかを確認してください。

+0

に移動してみてください。これは正しいです。 – jpsim

関連する問題