2016-12-23 4 views
0

У меня есть модели, которые являются Group и Thread, которые имеют отношение какКак сделать триггер KVO после транзакции Realm?

Group 1-Многие тему

У меня есть этот код, который будет триггером при выходе из группы происходит

[RLMRealm transactionWithBlock:^(RLMRealm *realm) { 
    // Clear all unread in threads 
    RLMResults<Thread *> *threads = [Thread allThreadsInGroupID:self._id]; 
    for (Thread *thread in threads) { 
     [thread clearLocalUnreads]; // <-- Trigger KVO for thread 
    } 

    // Delete group 
    [realm deleteObject:self]; 
} error:nil]; 

В ViewController, я использую KVO наблюдать некоторое свойство Thread и вызвать этот метод, когда что-то изменилось

- (void)threadsControllerDidReloadData:(ThreadsController *)controller { 

    // To prevent realm notification infinite loop in WorkspaceKPIDatasource 
    if ([self.tableView.dataSource isKindOfClass:[WorkspaceTableViewController class]]) { 
     WorkspaceTableViewController *workspaceTVC = (WorkspaceTableViewController *)self.tableView.dataSource; 
     if ([workspaceTVC.contentDatasource isKindOfClass:[WorkspaceThreadsDatasource class]]) { 
      [self.tableView reloadData]; 

      // Fix crash when reloadData is try to access group during leave since calling reloadData, the update 
      // will not happen immediately. This line will force the layout to update immediately result in calling 
      // - cellForRowAtIndexPath in the same run loop to prevent accessing invalidate group 
      [self.tableView.superview layoutIfNeeded]; // <-- This solve crash 
     } 
     [workspaceTVC refreshHeader]; 
    } 
} 

Есть две проблемы

  1. KVO спусков без царств сделки полной
  2. cellForRowAtIndexPath после вызова reloadData не будет работать сразу приводят к тому, что триггер KVO перед удалением группы, когда ячейки имеют макет, он разбивается, почему пытается получить доступ к группе недействительных.

Я преодолеваю эту проблему, выбирая вариант 2 на данный момент, поскольку это проще всего. Но я думаю, что более разумным способом является запуск KVO триггера только после завершения транзакции. В этом случае независимо от того, что произойдет в транзакции, будет сгруппировано в конце.

Из-за этой проблемы, которая заставляет меня думать, что KVO для realm может, вероятно, вызовет некоторые проблемы, например, если транзакция провалилась на полпути, но каким-то образом KVO уже является триггером из-за изменения на уровне объекта.

Но, прочитав документ here. Мне кажется, как KVO позвонит, когда транзакция записи происходит, но я не знаю, почему в моем случае, когда Thread обновляется и - threadsControllerDidReloadData: называется почему [group isInvalidated] еще вернуться NO в этом методе

ответ

1

От звука его, КВО возможно, не подходит для того, что вы пытаетесь выполнить.

Если вы взаимодействуете с данными в виде таблицы, возможно, более целесообразно использовать Realm's fine-grained notifications для регистрации изменений. Эта система предназначена для работы с представлениями таблиц и откладывает и доставляет уведомления в то время, более подходящие для обновления содержимого табличного представления.

+0

Я использую KVO, потому что структура нашего приложения похожа на 1 группу, определенно будет прикреплена к ней 1 нить. Этот KVO наблюдается для этой конкретной нити. Кстати, как мы можем наблюдать один объект без KVO? Нужно ли нам создавать '[RLMRealm objectsWithPrimaryKey:] addNoti ....' Мне кажется, это слишком сложно. Благодарю. – SaintTail

+0

Ahh okay then! Да, есть предложение добавить блок уведомлений к одному объекту Realm: https://github.com/realm/realm-cocoa/issues/3431 Это определенно считается! – TiM

Смежные вопросы