2012-05-14 36 views
1

我們有一個非常強大且充實的系統,用於使用NSManagedObjectContextObjectsDidChangeNotification來檢測iOS應用中模型的變化。這適用於我們的屬性更改以及1:1和1:M關係的更改。檢測CoreData中的多對多關係變化

我們正試圖建立一些M:M關係到我們的模式,我正在努力看看Coredata的通知系統如何讓我們觀察M:M關係中的特定變化。

我猜如果M:M關係發生變化,涉及到更改的兩個對象都會出現在NSUpdatedObjectsKey列表中,但不會有任何特定的註釋說M:M之間的關係他們已經改變了,或者是哪個M:M關係(假設兩個模型之間可能存在多於一個M:M關係)。

有沒有人有使用Coredata的通知系統檢測M:M關係中的變化的運氣?或者他們基本上很難與人合作,人們傾向於明確創建「連接表」作爲一種真正的類型(從而以兩個1:M關係而不是單個M:M關係結束)?

回答

2

您是對的:當M:M關係改變時,關係兩端的對象顯示在NSManagedObjectContextObjectsDidChangeNotification的相應字典中。

如果您正在掃描查找已更改的特定屬性的對象,則可以使用方法changedValues(或更好的,在ios5上的changedValuesForCurrentEvent)來查找屬性名稱。你可能已經在做這個。

然後,您可以檢查模型,以查看是否有任何給定的屬性是多方面的:許多與否:

-(void)notifyObjectsChanged:(NSNotification *)note 
{ 
    assert([NSManagedObjectContextObjectsDidChangeNotification isEqual:note.name]); 
    for (NSManagedObject *mo in [note.userInfo objectForKey:NSUpdatedObjectsKey]) 
    { 
    NSLog(@"for %@ :", mo.objectID); 
    NSDictionary *rels = mo.entity.relationshipsByName; 
    for (NSString *prop in [mo.changedValuesForCurrentEvent allKeys]) 
    { 
     NSRelationshipDescription *rel = [rels objectForKey:prop]; 
     if (rel.isToMany && rel.inverseRelationship.isToMany) 
     NSLog(@"many-to-many relationship %@ changed", prop); 
    } 
    } 
} 

(!未經測試,把我的頭頂部,注意有無錯別字)

的關鍵技術是託管對象保持對對象模型描述的引用,您可以在運行時檢查它。

+0

其實,我並不知道「changedValues」或「changedValuesForCurrentEvent」。感謝這一點,他們會做得很好。 – glenc