Согласно документам Realm о потоке :
Когда вы первоначально открываете область в потоке, его состояние будет основано на самой последней успешной записи commit
и :
Если не разрешить ThreadSafeReference, исходная версия Realm будет закреплена до тех пор, пока ссылка не будет освобождена.
Это дает немного запутанные результаты при совместном использовании. Если ThreadSafeReference
асинхронно разрешен в фоновой очереди, он показывает старые (закрепленные) значения. Но если значение ThreadSafeReference
равно синхронно , то оно показывает обновленные значения.
Допустим, у меня есть простой объект области: MyObject
с одним name
свойством:
// setup, create object with name: "a"
let queue = DispatchQueue(label: "com.app.my", qos: .default, attributes: [])
let obj = MyObject(name: "a")
try realm.write { realm.add(obj) }
// get reference (deliberately created before update)
let ref = ThreadSafeReference(to: obj)
// update name to "b" (main queue, or .sync on other queue)
try realm.write {
obj.name = "b"
}
// async resolve on background thread
queue.async {
let r = try! Realm()
let o = r.resolve(ref)!
XCTAssertEqual("b", o.name) // fails, o.name == "a"
r.refresh()
XCTAssertEqual("b", o.name) // succeeds
}
По сравнению с:
// setup, create object with name: "a"
let queue = DispatchQueue(label: "com.app.my", qos: .default, attributes: [])
let obj = MyObject(name: "a")
try realm.write { realm.add(obj) }
// get reference (deliberately created before update)
let ref = ThreadSafeReference(to: obj)
// update name to "b" (main queue, or .sync on other queue)
try realm.write {
obj.name = "b"
}
// sync resolve on background thread
queue.sync {
let r = try! Realm()
let o = r.resolve(ref)!
XCTAssertEqual("b", o.name) // succeeds
}
Если queue.sync
используется вместо queue.async
. Область не требуется обновлять вручную, а в разрешенной ссылке сразу же отображается обновленное имя "b"
. Это также тот случай, когда область запрашивается для MyObject
вместо разрешения ссылки.
Так что же такое поведение ThreadSafeReferences
? Похоже, что он иногда сохраняет закрепленные значения, но иногда нет. Почему в этом случае необходимо обновить sh Царство, когда оно должно основываться на «самой последней успешной фиксации записи»?