2017-01-12 17 views
6

Sau khi di chuyển ứng dụng OS X của tôi từ phiên bản 2.2 sang swift 3.0 (phiên bản realm cũng đã thay đổi từ 1.0.2 sang 2.1.1) một số giao dịch ghi bắt đầu ném ngoại lệ: "Không thể tạo truy vấn không đồng bộ khi đang trong giao dịch ghi". Nhưng nó đã hoạt động tốt trước khi di chuyển."Không thể tạo truy vấn không đồng bộ khi đang trong giao dịch ghi" ngoại lệ

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 } 
}) 

Khi bắt đầu giao dịch, nó sẽ đưa ra một ngoại lệ. Tại sao điều này xảy ra và làm thế nào tôi có thể sửa chữa nó?

+0

Vui lòng thử di chuyển các truy vấn vào Giao dịch – EpicPandaForce

Trả lời

0

Dường như bạn đang tắt tiếng messages trong forEach, điều này có thể là nguyên nhân gây ra sự cố.

Hãy thử một cái gì đó như thế này:

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 } 
}) 

Có lẽ nó không phải là giải pháp tốt nhất, vì bạn sẽ load tất cả các tin nhắn trong bộ nhớ, nhưng nên làm việc.

0

Tôi nghĩ bạn chỉ cần di chuyển các truy vấn vào giao dịch.

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

Đã phải đối mặt với cùng một vấn đề trong mã của tôi, và nó bật ra rằng bắt đầu giao dịch ghi được kích hoạt thông báo bộ sưu tập mà lần lượt tạo ra một RLMResults mới và bổ sung thêm một khối thông báo với nó, có nghĩa là tôi đang gọi addNotificationBlock bên trong giao dịch ghi và gặp sự cố.

Nếu bạn có thể sao chép, hãy đặt điểm ngắt trong results.cpp - void Results::prepare_async() nơi ngoại lệ được ném và xem mã của bạn đang cố gắng làm gì.

+0

Điều này là chính xác. – jpsim

Các vấn đề liên quan