2016-12-23 9 views
0

私はレルムのトランザクションが完了した後にKVOトリガーを作成するには?

グループ 1対多スレッド

のような関係を持ってGroupThreadあるモデルは、私は休暇グループが

を発生したときにトリガされますこのコードを、持っています
[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]; 
    } 
} 

を変更したときに、ここで二つの問題

  1. KVOはreloadDataを呼び出した後
  2. cellForRowAtIndexPath完全レルムトランザクションなしトリガーではあります。このメソッドを呼び出すグループが削除される前にKVOトリガが発生した場合でも、セルがレイアウトされていると、無効化グループにアクセスしようとするとクラッシュします。

この問題は、これが最も簡単なのでオプション2を選択することで克服しました。 しかし、より合理的なやり方は、トランザクションが完了した後にだけKVOトリガーとすることです。その場合、取引で何が起こっても、最後にグループ化されます。

KVOが領域のためにトランザクションが途中で失敗したような問題を引き起こす可能性がありますが、どういうわけかKVOがオブジェクトレベルでの変更のために既にトリガーしているためです。

しかし、文書hereを読んでください。ライト・トランザクションが発生したときに呼び出されますKVOのように私には思われるが、Threadが更新されたとき、私はなぜ私の場合はを知らないと- threadsControllerDidReloadData:はなぜ[group isInvalidated]まだ、KVOそれの音から、その方法

答えて

1

NOを返すと呼ばれていますあなたが達成しようとしているものには適切ではないかもしれません。

テーブルビューでデータとやりとりする場合は、Realm's fine-grained notificationsを使用して変更を登録する方が適切な場合があります。このシステムはテーブルビューで動作するように設計されており、テーブルビューのコンテンツの更新に適した時間に通知を延期して配信します。

+0

私のアプリの構造は1つのグループに間違いなく1つのスレッドが付いているようなのでKVOを使用します。このKVOはその特定のスレッドを監視しています。ところで、私たちはKVOなしでどのようにオブジェクトを観察できますか?私は '[RLMRealm objectsWithPrimaryKey:] addNoti ....'を作成する必要がありますか?ありがとう。 – SaintTail

+0

ああ大丈夫!ええ、単一のRealmオブジェクトに通知ブロックを追加できるという提案があります:https://github.com/realm/realm-cocoa/issues/3431これは間違いなく考慮されています! – TiM

関連する問題