1

他のプロパティに基づいて生成されたプロパティを持つオブジェクトがある場合、通常は+keyPathsForValuesAffecting{PropertyName}クラス メソッドを実装します。

私がやろうとしているのは、基本的に NSManagedObject のプロパティと同じことですが、関係をたどっています。

私のモデルは単純です。App と Version の 2 つのエンティティがあります (appcast を生成するアプリを作成しています)。アプリのプロパティが変更されると、上記のメソッドを実装したため、-appcast 文字列が変更され、すべてのバインディングが適切に更新されます。

ただし、特定のアプリのいずれかのバージョン (対多関係) のプロパティが変更されると、-appcast プロパティが適切に生成されません。修正/回避策を講じることはできますか?

4

1 に答える 1

3

これは少し遅い答えですが、よくある状況だと思います。答えはすぐにはわかりません。

私は通常、managedObjectContext が変更されるのを監視し、変更されたオブジェクトの中に注意したいオブジェクトがあるかどうかを確認します。したがって、NSManagedObjectサブクラスで:

// We need to register for the notification in both awakeFromFetch
// AND awakeFromInsert, since either one could be called, depending on
// if the object was previously-created or not
- (void)awakeFromFetch {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(managedObjectContextDidChange:) name: NSManagedObjectContextObjectsDidChangeNotification object:[self managedObjectContext]];
}

- (void)awakeFromInsert {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(managedObjectContextDidChange:) name: NSManagedObjectContextObjectsDidChangeNotification object:[self managedObjectContext]];
}

- (void)managedObjectContextDidChange:(NSNotification *)notification {
    // Get a set containing ALL objects which have been changed
    NSSet *insertedObjects = [[notification userInfo] objectForKey:NSInsertedObjectsKey];
    NSSet *updatedObjects = [[notification userInfo] objectForKey:NSUpdatedObjectsKey];
    NSSet *deletedObjects = [[notification userInfo] objectForKey:NSDeletedObjectsKey];

    NSSet *changedObjects = [insertedObjects setByAddingObjectsFromSet:updatedObjects];
    changedObjects = [changedObjects setByAddingObjectsFromSet:deletedObjects];

    if ([changedObjects intersectsSet:[self versions]]) {
        [self willChangeValueForKey:@"appCast"];
        [self didChangeValueForKey:@"appCast"];
    }
}

オブジェクト グラフ内の何かが変更されるたびにこの通知が発生するため、これはパフォーマンスの観点からは理想的ではありませんが、これが最も簡単な方法であることがわかりました。

于 2009-09-01T00:19:47.270 に答える