我有模型,它是
Group
和
Thread
它们的关系如下:
组
一对多
线
我有这个代码,当离开组时会触发
[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
线
并在发生更改时调用此方法
- (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
不会立即运行,即使
在删除组之前触发,当单元格处于布局时,它会崩溃。为什么尝试访问无效组。
我现在选择选项2来克服这个问题,因为它最简单。
但我认为更合理的方法是让
KVO
仅在事务完成后触发。在这种情况下,无论事务中发生什么,都将在最后进行分组。
因为这个问题,我认为
KVO
对于领域来说,可能会导致一些问题,比如事务在中途失败,但不知何故
KVO
由于对象级别的更改,已触发。
而是通过阅读文件
here
.在我看来
KVO
将在写入事务发生时调用,但我不知道为什么,在我的情况下,何时调用
线
已更新,并且
- threadsControllerDidReloadData:
叫做为什么
[group isInvalidated]
仍然返回
NO
用那种方法