मुझे कोर डेटा में व्यस्त संबंधों के साथ एक बहुत ही अजीब समस्या है, और मैंने विंडो टेम्पलेट के आधार पर एक्सकोड में एक नई परियोजना से शुरू होने पर, मेरी समस्या को कम से कम उदाहरण में कम करने में कामयाब रहा है कोर डेटा के समर्थन के साथ (यानी, वहां बहुत कम है)।उलटा संबंध सेट नहीं है (केवीओ हैंडलर में)
मान लीजिए कि हमारे पास तीन इकाइयों के साथ कोर डेटा मॉडल है: विभाग, कर्मचारी, और विभागसमरी (कुछ प्रकार की इकाई विभाग के बारे में कुछ आंकड़ों का प्रतिनिधित्व करती है)। सादगी के लिए, हमारे पास केवल एक-से-एक संबंध हैं:
DepartmentSummary Department Employee
---------------------------------------------------------
employee <----> department
department <----> summary
यह सब मॉडल में है। application:didFinishLaunchingWithOptions:
में हम एक कर्मचारी और एक विभाग और KVO सेट अप बनाने के लिए:
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"];
KVO हैंडलर के उद्देश्य के रूप में जल्द ही कर्मचारी के विभाग की स्थापना की है विभाग के लिए एक सारांश बनाने के लिए है:
- (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];
}
तो सब कुछ उम्मीद के रूप में काम करता है। उलटा संबंध वास्तव में, यदि आप डेटाबेस को बचाने के लिए थे वस्तु ग्राफ में निर्धारित करते हैं, करता है, हालांकि यह डेटाबेस में तैयार हो जाओ (नहीं मिलता है और पुन: प्रारंभ:
अभिकथन बजाय करता नहीं मदद में देरी ऐप, अब अचानक अचानक उलटा संबंध दिखाई देता है)।
क्या यह कोर डेटा में एक बग है? क्या यह दस्तावेज व्यवहार है जिसे मैंने याद किया है? क्या मैं कोर डेटा का उपयोग ऐसे तरीके से कर रहा हूं जिसका इरादा नहीं था?
ध्यान दें कि KVO हैंडलर कहा जाता हो जाता है, जबकि कोर डाटा (स्वतः) है की स्थापना एक (अन्य) उलटा: हम स्वयं विभाग के employee
क्षेत्र निर्धारित करते हैं, कोर डेटा स्वचालित रूप कर्मचारी की department
फ़ील्ड सेट करता है, और कहा कि बदले में चलाता है केवीओ हैंडलर। शायद यह है कि कोर डेटा को संभालने के लिए के लिए :) दरअसल जब हम सेट
[employee setValue:department forKey:@"department"];
बजाय, सब कुछ फिर से अपेक्षा के अनुरूप काम करता है बहुत ज्यादा है।
किसी भी पॉइंटर्स की सराहना की जाएगी।
क्या होगा यदि आप तुरंत सारांश सेट करते हैं, लेकिन अगले * रनरॉप तक * आपके * दावे * में देरी करें? – jtbandes
उत्कृष्ट सवाल। मैं इसका जवाब देने के लिए प्रश्न संपादित करूंगा - मूल रूप से, दावे में देरी से मदद नहीं मिलती है। – edsko
हाय, मैंने वही देखा, यह पहले काम कर रहा था ... – RolandasR