私はレルムのトランザクションが完了した後にKVOトリガーを作成するには?
グループ 1対多スレッド
のような関係を持って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
では、すぐに実行されません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は
reloadData
を呼び出した後 cellForRowAtIndexPath
完全レルムトランザクションなしトリガーではあります。このメソッドを呼び出すグループが削除される前にKVO
トリガが発生した場合でも、セルがレイアウトされていると、無効化グループにアクセスしようとするとクラッシュします。
この問題は、これが最も簡単なのでオプション2を選択することで克服しました。 しかし、より合理的なやり方は、トランザクションが完了した後にだけKVO
トリガーとすることです。その場合、取引で何が起こっても、最後にグループ化されます。
KVO
が領域のためにトランザクションが途中で失敗したような問題を引き起こす可能性がありますが、どういうわけかKVO
がオブジェクトレベルでの変更のために既にトリガーしているためです。
しかし、文書hereを読んでください。ライト・トランザクションが発生したときに呼び出されますKVO
のように私には思われるが、Thread
が更新されたとき、私はなぜ私の場合はを知らないと- threadsControllerDidReloadData:
はなぜ[group isInvalidated]
まだ、KVOそれの音から、その方法
私のアプリの構造は1つのグループに間違いなく1つのスレッドが付いているようなのでKVOを使用します。このKVOはその特定のスレッドを監視しています。ところで、私たちはKVOなしでどのようにオブジェクトを観察できますか?私は '[RLMRealm objectsWithPrimaryKey:] addNoti ....'を作成する必要がありますか?ありがとう。 – SaintTail
ああ大丈夫!ええ、単一のRealmオブジェクトに通知ブロックを追加できるという提案があります:https://github.com/realm/realm-cocoa/issues/3431これは間違いなく考慮されています! – TiM