Чтение обновленной Realm ThreadSafeReference в фоновой очереди - PullRequest
0 голосов
/ 31 марта 2020

Согласно документам 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 Царство, когда оно должно основываться на «самой последней успешной фиксации записи»?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...