2011-08-10 4 views
5

के बीच डेटा अलग है, हमें यह समस्या है जहां विभिन्न धागे एक ही रिकॉर्ड पर अलग-अलग डेटा देखते हैं लेकिन विभिन्न प्रबंधित ऑब्जेक्ट संदर्भ (एमओसी) के साथ। हमारा ऐप पृष्ठभूमि में सर्वर एपीआई में सिंक करता है। सभी सिंकिंग अपने स्वयं के धागे पर और अपने स्वयं के moc का उपयोग कर किया जाता है। हालांकि, हमने पाया है कि जब मुख्य डेटा पर डेटा अपडेट हो जाता है तो डेटा में परिवर्तन पृष्ठभूमि moc में नहीं दिखाया जाता है। कोई विचार क्या हो रहा है? यहां कुछ और विवरण दिए गए हैं: हम ग्रैंड सेंट्रल प्रेषण का उपयोग कर रहे हैं ताकि सिंक ऑपरेशंस को अपने स्वयं के धागे पर रखा जा सके: हमने जांच की है कि कौन सी कतार चीजें चल रही हैं और यह सब कतार पर अपेक्षित हो रहा है।आईओएस कोर्डटा अद्यतन विभिन्न प्रबंधित ऑब्जेक्ट संदर्भों पर नहीं देखे गए हैं - संदर्भ

- (void) executeSync; { 

    dispatch_async(backgroundQueue, ^(void) { 
     if([self isDebug]) 
      NSLog(@"ICSyncController: executeSync queue:%@ \n\n\n\n\n", [self queue]); 


     for(id <ICSyncControllerDelegate> delegate in delegates){ 
      [delegate syncController:self]; 
     } 
     if([ICAccountController sharedInstance].isLoggedIn == YES && shouldBeSyncing == YES) { 
      dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 300ull * NSEC_PER_SEC), dispatch_get_current_queue(), ^{ 
       [self executeSync]; 
      }); 
     } 

    }); 
} 
यहाँ

कैसे हम पृष्ठभूमि MOC बना सकते हैं और हम पुष्टि की है कि यह पृष्ठभूमि कतार पर बनाया है।

- (NSManagedObjectContext*)backgroundObjectContext { 

    if (_backgroundObjectContext) 
     return _backgroundObjectContext; 

    _backgroundObjectContext = [[NSManagedObjectContext alloc] init];  
    [_backgroundObjectContext setPersistentStoreCoordinator:self.persistentStoreCoordinator]; 
    [_backgroundObjectContext setStalenessInterval:0.0]; 

    return _backgroundObjectContext; 
} 

मैं जोड़ने चाहिए कि हमारी पृष्ठभूमि MOC डेटा के लिए requerying जाता है और उन रिकॉर्ड है कि कार्रवाई से लौटे अभी भी कुछ क्षेत्रों के लिए पुराने मूल्यों की है। पृष्ठभूमि moc वर्तमान डेटा को कैसे प्राप्त करता है जो पहले से ही मुख्य moc द्वारा सहेजा गया था? मैंने सोचा कि मुझे केवल इन रिकॉर्ड्स की वर्तमान स्थिति मिल जाएगी ..

आवश्यकता के अनुसार मेरा मतलब है: पृष्ठभूमि एमओसी रिकॉर्ड के बाद "ताजा" डेटा प्राप्त करने के लिए एक और "क्वेरी" निष्पादित कर रहा है मुख्य moc, अभी तक डेटा पुराने मान हैं - मुख्य moc में चिह्नित अद्यतन मान नहीं।

+ (NSArray *)dirtyObjectsInContext:(NSManagedObjectContext *)moc { 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SUBQUERY(memberships, $m, $m.category.name == %@ AND $m.syncStatus > %d)[email protected] > 0", MANAGED_CATEGORY_FAVORITES, ManagedObjectSynced]; 

    return [self managedObjectsWithPredicate:predicate inContext:moc]; 
} 

आपका मदद बेहद सराहना की के रूप में हम यह पता लगा है, या उस के चारों ओर एक काम खोजने अब दिनों के लिए हमारे सूत्र खुदाई शामिल नहीं है की कोशिश कर रहा हूँ।

उत्तर

4

इस तरह यह काम करना चाहिए - वास्तव में, प्रबंधित ऑब्जेक्ट संदर्भ की एक महत्वपूर्ण भूमिका आपको अन्य धागे में किए गए डेटा में परिवर्तन से बचाने के लिए है। उस खतरे की कल्पना करें जो परिणामस्वरूप होगा यदि आपके पास एक ही ऑब्जेक्ट को संशोधित करने वाला पृष्ठभूमि थ्रेड था जो मुख्य थ्रेड किसी प्रकार की सिंक्रनाइज़ेशन योजना के बिना उपयोग कर रहा था।

Communicating Changes Between Contexts पढ़ें कि एक संदर्भ से दूसरे संदर्भ में परिवर्तन कैसे मर्ज करें।

+1

आपकी सहायता के लिए धन्यवाद। मुझे लगता है कि मेरे लिए आश्चर्य यह था कि हम रिकॉर्ड की आवश्यकता है, लेकिन वर्तमान डेटा प्राप्त नहीं करते हैं। हमने अभी पाया है कि यह [[[ICCoreDataController साझा किया गया] पृष्ठभूमि ऑब्जेक्ट कॉन्टेक्स्ट] रीसेट]; पृष्ठभूमि संदर्भ पर हमारे मुद्दों को हल किया। हालांकि मुझे यह बेहतर समझना अच्छा लगेगा। धन्यवाद!! –

4

मैं निम्नलिखित कोड का उपयोग संदर्भ 2 पर बदलावों को सुनने ताकि संदर्भ 1 अद्यतन रखता है:

NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; 
    [nc addObserver:context1 
     selector:@selector(contextTwoUpdated:) 
      name:NSManagedObjectContextDidSaveNotification 
      object:context2]; 

यह संदर्भ 1 पर कहा जा करने के लिए इस विधि का कारण बनता है, और मैं मर्ज विधि आह्वान :

- (void)contextTwoUpdated:(NSNotification *)notification { 
    [context1 mergeChangesFromContextDidSaveNotification:notification]; 
} 

इस का एक पक्ष प्रभाव किसी भी NSFetchedResultsController कि context1 से जुड़ा हुआ है परिवर्तन की यह बताए अपने प्रतिनिधि को संदेश की एक किस्म भेज देंगे, है

मैंने उपयोगकर्ता को ऑब्जेक्ट को बदलने के दौरान दोनों तरीकों को सुनने की कोशिश नहीं की है और आप उन्हें उपयोगकर्ता से पीछे अपडेट करते हैं - मुझे संदेह है कि अगर ऐसा है तो आपको विलय का प्रबंधन करना पड़ सकता है, क्योंकि यह एक तरफा (और सभी उपयोगकर्ता संचालित) है मुझे लगता है कि सभी अपडेट मान्य होने के लिए