У меня есть модели, которые являются 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];
}
}
Есть две проблемы
- KVO спусков без царств сделки полной
cellForRowAtIndexPath
после вызоваreloadData
не будет работать сразу приводят к тому, что триггерKVO
перед удалением группы, когда ячейки имеют макет, он разбивается, почему пытается получить доступ к группе недействительных.
Я преодолеваю эту проблему, выбирая вариант 2 на данный момент, поскольку это проще всего. Но я думаю, что более разумным способом является запуск KVO
триггера только после завершения транзакции. В этом случае независимо от того, что произойдет в транзакции, будет сгруппировано в конце.
Из-за этой проблемы, которая заставляет меня думать, что KVO
для realm может, вероятно, вызовет некоторые проблемы, например, если транзакция провалилась на полпути, но каким-то образом KVO
уже является триггером из-за изменения на уровне объекта.
Но, прочитав документ here. Мне кажется, как KVO
позвонит, когда транзакция записи происходит, но я не знаю, почему в моем случае, когда Thread
обновляется и - threadsControllerDidReloadData:
называется почему [group isInvalidated]
еще вернуться NO
в этом методе
Я использую KVO, потому что структура нашего приложения похожа на 1 группу, определенно будет прикреплена к ней 1 нить. Этот KVO наблюдается для этой конкретной нити. Кстати, как мы можем наблюдать один объект без KVO? Нужно ли нам создавать '[RLMRealm objectsWithPrimaryKey:] addNoti ....' Мне кажется, это слишком сложно. Благодарю. – SaintTail
Ahh okay then! Да, есть предложение добавить блок уведомлений к одному объекту Realm: https://github.com/realm/realm-cocoa/issues/3431 Это определенно считается! – TiM