2012-01-20 8 views
6

मुझे गंभीर समस्याएं हैं क्योंकि मैंने अपने मुख्य डेटा तर्क को RKManagedObjectStore में माइग्रेट किया है। मैं सेटअप संदर्भ दृश्य नियंत्रक में मुख्य थ्रेड के भीतर [NSManagedObject managedObjectContext] करने के लिए सेट के साथ एक NSFetchedResultsController:Restkit [NSManagedObject प्रबंधितObjectContext] अलग-अलग उदाहरण देता है

assert([NSThread isMainThread]); 
NSManagedObjectContext* context = [NSManagedObject managedObjectContext]; 
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:[Item fetchRequest] managedObjectContext:context sectionNameKeyPath:nil cacheName:@"Master"]; 

मैं इस तरह के संदर्भ में ऑब्जेक्ट सम्मिलित:

Item* item = [Item object]; 
item.name = @"Foo"; 
[[RKObjectManager sharedManager].objectStore save]; 

लेकिन लाए जाने के परिणाम नियंत्रक परिवर्तनों की अधिसूचना नहीं मिली है। इस प्रकार मैं एक अधिसूचना मैन्युअल पंजीकृत:

[[NSNotificationCenter defaultCenter] addObserverForName:NSManagedObjectContextDidSaveNotification object:nil queue:nil usingBlock:^(NSNotification *note) { 
    NSLog(@"Context changed"); 

    [self.fetchedResultsController performFetch:nil]; 
    [self.tableView reloadData]; 
}]; 

यह वास्तव में, मुझे लगता है कि आवश्यक नहीं होना चाहिए, क्योंकि RKManagedObjectStore विभिन्न संदर्भों में परिवर्तन विलीन हो जाती है। दूसरा, मद ऑब्जेक्ट को हटाने के लिए मैंने कोशिश की

[item deleteEntity]; 

यह कह रही है कि वस्तु किसी अन्य संदर्भ में हटाया नहीं जा सकता एक त्रुटि का उत्पादन किया। यह स्पष्ट रूप से सच है, लेकिन क्यों नरक मुख्य थ्रेड के लिए संदर्भ नहीं है? मैं दृश्य नियंत्रक के अंदर भी निम्न सिर्फ एन इकाई को हटाने से पहले फोन:

assert([NSThread isMainThread]); 
NSManagedObjectContext* sameContext1 = [NSManagedObject managedObjectContext]; 
NSManagedObjectContext* sameContext2 = self.fetchedResultsController.managedObjectContext; 
assert(sameContext1 == sameContext2); //FAILS 

RKManagedObjectStore के managedObjectContext गेटर कार्यान्वयन जो जब [NSManagedObject managedObjectContext] का उपयोग कर कहा जाता है को देखते हुए, धागा प्रति एक ही उदाहरण लौटे किया जाना चाहिए:

-(NSManagedObjectContext*)managedObjectContext { 
    NSMutableDictionary* threadDictionary = [[NSThread currentThread] threadDictionary]; 
    NSManagedObjectContext* backgroundThreadContext = [threadDictionary objectForKey:RKManagedObjectStoreThreadDictionaryContextKey]; 
    ... 
} 

उत्तर

9

अंततः मैंने इसे डिबगिंग के घंटों के बाद उस खराब बग को ट्रैक किया। समस्या यह है कि RKObjectManager पर RKManagedObjectStore का संदर्भ है। लेकिन किसी भी तरह एआरसी का उपयोग करते समय उस संदर्भ को [RKObjectManager sharedManager] उदाहरण में नहीं रखा जाता है और इसे हटा दिया जा रहा है। इससे थ्रेड स्थानीय कैश की फ्लशिंग हो जाती है। इसलिए प्रबंधित ऑब्जेक्ट संदर्भ विलय काम नहीं कर रहा है क्योंकि प्रत्येक पहुंच पर एक नया प्रबंधित संदर्भ बनाया गया है। फिक्स आसान है। बस अपने ऐप प्रतिनिधि में RKManagedObjectStore का एक मजबूत संदर्भ रखें और आप कर चुके हैं।