2009-07-25 35 views
1

當我們有一個對象具有基於其他屬性生成的屬性時,通常我們實現了+keyPathsForValuesAffecting{PropertyName}類方法。如何告訴(託管)對象通知其KVO其屬性需要被回收?

我想要做的事對我的NSManagedObject屬性基本上是一樣的,但遍歷關係。

我的模型很簡單;我有兩個實體,應用程序和版本(我正在創建一個生成應用程序的應用程序)。當應用程序的屬性發生變化時,因爲我實現了上述方法,所以-appcast字符串被更改,並且所有綁定都會被適當地更新。

但是,如果任何特定應用程序版本(對多關係)的任何屬性發生更改,則不會正確生成-appcast屬性。我可以修復/解決方法?

+1

要清楚:`appCast`是`App`上的一個屬性,當您更改`Version`上的值時(可能通過`versions`屬性或類似的`App`鏈接)appCast `財產不發送變更通知? – Alex 2009-07-26 04:10:54

回答

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"]; 
    } 
} 

這當然是從性能的角度來看並不理想,因爲該通知要解僱你的對象圖的每一次變化什麼,但我發現它是最直接的方式來實現這一點。

相關問題