Синхронизированные объекты LinkingObjects на основе запросов, возвращающие ноль - PullRequest
0 голосов
/ 07 мая 2020

Все решения, которые я нашел в Интернете, предназначены для локальных Realms, а не для синхронизированных Realms (я использую синхронизацию на основе запросов c). Как это сделать правильно для синхронизированного Realm?

У меня есть объект Shop и объект Item. Shop имеет много предметов. Пользователь может просматривать товары и должен видеть, к какому магазину принадлежит этот товар. Довольно простой и понятный сценарий.

В классе Shop у меня есть:

let items = List<Item>()

, а в классе Item -

let shops = LinkingObjects(fromType: Shop.self, property: "items")
var shop: Shop? { return shops.first }

Запрос области выглядит следующим образом:

private var realm             : Realm!
private var subscriptionToken : NotificationToken?
private var syncSubscription  : SyncSubscription!

...
...
...

let items = realm.objects(Item.self)
syncSubscriptionItem = items.subscribe()
subscriptionTokenItem = syncSubscriptionItem.observe(\.state, options: .initial) { state in
    if state == .complete {
        let shopName = items[0].shop?.name // Shop is always nil
    }
}

Я могу видеть магазин, только если владелец магазина вошел в приложение, что означает, что Realm синхронизировала информацию о магазине с локальным Realm. Но для пользователей других устройств магазины никогда не синхронизируются. Но как синхронизировать c магазины для всех других пользователей с помощью этого типа обратной ссылки?

Скриншот прилагается, чтобы прояснить, что я имею в виду:

enter image description here

1 Ответ

0 голосов
/ 09 мая 2020

Я потратил минуту и ​​написал код, основанный на вашем. Код в вопросе был неполным, поэтому я добавил в код все остальные элементы, чтобы нарисовать более полную картину. Здесь действительно нет проверки ошибок, поэтому обязательно добавьте это. Это работает для меня и выводит все товары, связанные с магазинами

var items: Results<Item>? = nil
var notificationToken: NotificationToken? = nil
var subscriptionToken: NotificationToken? = nil
var subscription: SyncSubscription<Item>!
var realm: Realm!

func setupItems() {
    let config = SyncUser.current?.configuration()
    self.realm = try! Realm(configuration: config!)

    self.items = self.realm.objects(Item.self)

    self.subscription = self.items!.subscribe(named: "my-items")

    self.subscriptionToken = subscription.observe(\.state, options: .initial) { state in
        if state == .complete {
            print("subscription: queried data has been synced")
        } else {
            print("Subscription State: \(state)")
        }
    }

    self.notificationToken = self.items!.observe { changes in
        switch changes {
        case .initial:
            // Results are now populated and can be accessed without blocking the UI
            print("notification: initial results are populated")
            for item in self.items! {
                if let shop = item.shop {
                    print(shop.name)
                } else {
                    print("\(item.itemName) has no shop")
                }
            }
        case .update(_, let deletions, let insertions, let modifications):
            // Query results have changed
            print("notification: results, inserted, deleteed or modified")
        case .error(let error):
            // An error occurred while opening the Realm file on the background worker thread
            fatalError("\(error)")
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...