领域交易完成后如何进行KVO触发?

时间:2016-12-23 04:52:17

标签: ios realm key-value-observing

我的模型是GroupThread,其关系类似于

  

群组 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之后
  3. reloadData将不会立即运行导致即使组中的KVO触发器被删除,当单元格布局时它会崩溃,为什么尝试访问无效组。
  4. 我现在选择选项2来克服这个问题,因为它最简单。 但我认为更合理的方法是在事务完成后让KVO触发。在这种情况下,无论交易中发生什么,都会在最后分组。

    由于这个问题导致我认为KVO对于领域可能会导致一些问题,例如,如果事务中途失败,但由于对象级别的更改,某种方式KVO已经触发

    但是阅读文件here。在我看来,KVO会在写入交易发生时调用,但我不知道为什么在我更新Thread并且调用- threadsControllerDidReloadData:时为什么{{1}仍然在该方法中返回[group isInvalidated]

1 个答案:

答案 0 :(得分:1)

从它的声音来看,KVO可能不适合你想要完成的事情。

如果您要在表格视图中与数据进行交互,则使用merge asof in docs注册更改可能更合适。该系统旨在用于表视图,并将在更适合更新表视图内容的时间推迟和发送通知。