Я застрял, разрешая многие ThreadSafeReferences для использования Realm с асинхронными задачами, такими как сетевые запросы? - PullRequest
0 голосов
/ 19 января 2019

У меня есть набор NSOperation с, которые делают сетевые запросы. Представьте себе случай, когда у нас есть объект User в Realm, и я хочу внести некоторые изменения, а затем отправить запрос PATCH на сервер:

let operation = UpdateUserOperation(updatedUser)

Затем операция выполняется в другом потоке, поэтому она должна разрешить потокобезопасную ссылку:

class UpdateUserOperation : Operation {
    var userReference : ThreadSafeReference<User>

    init(_ user: User) {
        userReference = ThreadSafeReference(to: user)
    }

    func main() {
        // We're probably on a different thread so resolve the reference
        let user = try! Realm().resolve(userReference)

        // That invalidated `userReference` so we need to create a new
        // one to use below...
        userReference = ThreadSafeReference(to: user)

        sendUserPatchRequest(user) { response in
            // We might be in _another_ thread again :(
            let realm = try! Realm()
            let user = realm.resolve(userReference)
            try! realm.write {
                user.updateFromResponse(response)
            }
        }
    }
}

Это похоже на действительно нечистый способ сделать это - повторно загрузить пользователя так много раз, чтобы выполнить довольно простую задачу. Это кажется особенно обременительным, потому что нам нужно обновить поточно-ориентированную ссылку - их нельзя использовать повторно. В Core Data мы могли бы выбрать один NSManagedObjectContext для нашей работы и обеспечить безопасность потоков с помощью managedObjectContext.perform { /* ... */ }, но такого рода функции недоступны в Realm.

Я что-то упустил? Есть ли лучший способ сделать это, или я застрял повторной выборки объекта каждый раз, когда мне нужно его использовать?

...