How to solve error "Realm accessed from incorrect thread"
When I use Realm library on ios project, I met "Realm accessed from incorrect thread" error.
This error means that thread where Realm object is initialized must be same as thread where Real object is accessed.
So, It is recommened that we create Realm object when we need it.
Original code:
class RealmManager {
static let shared = RealmManager()
lazy var realm: Realm = {
do {
print("Realm init, thread: \(OperationQueue.current == OperationQueue.main)")
let realm = try Realm()
return realm
} catch {
fatalError("Failed to initialize Realm: \(error)")
}
}()
//MARK: 상품관련
func addProduct(product: Product) {
do {
realm.writeAsync {
realm.add(product, update: .all)
}
} catch {
print("Error add product: \(error)")
}
}
}
New code:
class RealmManager {
static let shared = RealmManager()
// lazy var realm: Realm = {
// do {
// print("Realm init, thread: \(OperationQueue.current == OperationQueue.main)")
// let realm = try Realm()
// return realm
//
// } catch {
// fatalError("Failed to initialize Realm: \(error)")
// }
// }()
//MARK: 상품관련
func addProduct(product: Product) {
do {
let realm = try Realm()
realm.writeAsync {
realm.add(product, update: .all)
}
} catch {
print("Error add product: \(error)")
}
}
}
"writeAsync" method allow realm to perfrom background write operation.
This manages realm access in a thread-safe way without requiring you to write specialized code.
If you want to use Swift's async/await, you can use asyncWrite method.
✋ Create a Serial queue to use Realm on background thread.
When using Realm on a background thread, create a serial queue. Realm does not support using realms in concurrent queues, such as global queue.
0 댓글