我有一個非常奇怪的問題,在Core Data中存在反向關係,並且我設法將我的問題減少到最小范例,從基於窗口模板的xcode中的新項目開始與核心數據的支持(即,那裏很少)。未設置反向關係(在KVO處理程序中)
假設我們有一個包含三個實體的核心數據模型:Department,Employee和DepartmentSummary(表示關於部門的某些統計信息的某種實體)。爲了簡單起見,我們只有一對一的關係:
DepartmentSummary Department Employee
---------------------------------------------------------
employee <----> department
department <----> summary
這就是模型中的全部內容。在application:didFinishLaunchingWithOptions:
我們創建了一個員工和部門,成立了志願:
NSManagedObject* employee =
[NSEntityDescription
insertNewObjectForEntityForName:@"Employee"
inManagedObjectContext:[self managedObjectContext]];
[employee addObserver:self forKeyPath:@"department" options:0 context:nil];
NSManagedObject* department =
[NSEntityDescription
insertNewObjectForEntityForName:@"Department"
inManagedObjectContext:[self managedObjectContext]];
[department setValue:employee forKey:@"employee"];
的國際志願者組織處理程序的目的是爲了儘快僱員的部門設置創建爲部門總結:
- (void) observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
{
[self createSummary:object];
}
createSummary
很簡單:它創建一個新的彙總對象並將其與部門相關聯,然後檢查從部門到彙總對象的相反關係也設置爲:
- (void) createSummary:(NSManagedObject*)employee
{
NSManagedObject* department = [employee valueForKey:@"department"];
NSManagedObject* summary =
[NSEntityDescription
insertNewObjectForEntityForName:@"DepartmentSummary"
inManagedObjectContext:[self managedObjectContext]];
[summary setValue:department forKey:@"department"];
NSAssert([department valueForKey:@"summary"] == summary,
@"Inverse relation not set");
}
該斷言失敗。事實上,如果我們打印部門和總結對象彙總的部門已設置後,我們得到
entity: DepartmentSummary;
id: ..DepartmentSummary/..AA14> ;
data: {
department = "..Department/..AA13>";
}
的總結,符合市場預期,但
entity: Department;
id: ..Department/..AA13> ;
data: {
employee = "..Employee/..AA12>";
summary = nil;
}
的部門(用nil
概要)。然而,如果我們拖延調用createSummary
所以它不運行,直到runloop的下一次迭代:
- (void) observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
{
[self performSelector:@selector(createSummary:)
withObject:object
afterDelay:0];
}
則一切正常。
延緩斷言而不是做不幫助:逆關係真的沒有得到設置對象圖,儘管它在數據庫中獲取設置(如果你要保存數據庫,並重新啓動該應用程序,現在突然出現相反的關係)。
這是Core Data中的一個錯誤嗎?這是我所錯過的記錄行爲嗎?我是否以非預期的方式使用核心數據?
注意的是,國際志願者組織處理程序被調用而核心數據是(自動)設置的(其他)逆:我們手動設置部門的employee
領域,核心數據自動設置員工的department
場,而這又觸發KVO處理程序。也許這對於Core Data來說太過分了:)實際上,當我們設置
[employee setValue:department forKey:@"department"];
而是,所有事情再次按預期工作。
任何指針,將不勝感激。
如果您立即設置摘要,但延遲*斷言*直到下一個runloop? – jtbandes
優秀的問題。我將編輯這個問題來回答它 - 基本上,推遲斷言並沒有幫助。 – edsko
嗨,我注意到相同的,它之前工作... – RolandasR