我的模型是Group
和Thread
,其关系类似于
群组 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];
}
}
这里有两个问题
cellForRowAtIndexPath
之后reloadData
将不会立即运行导致即使组中的KVO
触发器被删除,当单元格布局时它会崩溃,为什么尝试访问无效组。我现在选择选项2来克服这个问题,因为它最简单。
但我认为更合理的方法是在事务完成后让KVO
触发。在这种情况下,无论交易中发生什么,都会在最后分组。
由于这个问题导致我认为KVO
对于领域可能会导致一些问题,例如,如果事务中途失败,但由于对象级别的更改,某种方式KVO
已经触发
但是阅读文件here。在我看来,KVO
会在写入交易发生时调用,但我不知道为什么在我更新Thread
并且调用- threadsControllerDidReloadData:
时为什么{{1}仍然在该方法中返回[group isInvalidated]
答案 0 :(得分:1)
从它的声音来看,KVO可能不适合你想要完成的事情。
如果您要在表格视图中与数据进行交互,则使用merge asof in docs注册更改可能更合适。该系统旨在用于表视图,并将在更适合更新表视图内容的时间推迟和发送通知。