10

में मैं कोर डेटा का उपयोग कर मेरी पहली व्यापक अनुप्रयोग लिख रहा हूँ, और मैं सबसे अच्छा तरीका विभिन्न वस्तु का ट्रैक रखने के क्या परिवर्तन/अद्यतन/हटाता है देखना चाहता हूँ। उदाहरण के लिए, मेरे पास एक नोट्स इकाई और एक स्थान इकाई है, और उनके बीच एक-से-एक संबंध है, यह विचार यह है कि प्रत्येक नोट में इसका स्थान टैग किया जा सकता है। मेरे पास एक fetchedResultsController नोट्स की सूची चलाते हुए UITableView है (जहां आप नए नोट्स जोड़ सकते हैं और उन्हें दिनांक और स्थान संलग्न कर सकते हैं), लेकिन फिर मेरे पास 2 अन्य व्यू कंट्रोलर हैं, एक नक्शा व्यू वाला है और कैलेंडर दृश्य वाला एक है । मानचित्र दृश्य स्थान पर सभी स्थानों को लाता है और उन्हें मानचित्र पर प्रदर्शित करता है। कैलेंडर दृश्य मूल रूप से नोट्स से सभी डेटा प्राप्त करता है और इसे कैलेंडर दृश्य में दिखाता है। मुझे अपने कैलेंडर और मानचित्र दृश्य में नोट्स और स्थान में परिवर्तनों का ट्रैक कैसे रखना चाहिए? एक बार दृश्य लोड करने में उन्हें लोड करना आसान है, लेकिन मुझे सभी परिवर्तनों का ट्रैक कैसे रखना चाहिए, ताकि जब उपयोगकर्ता मानचित्रदृश्य (उदाहरण के लिए) पर वापस आ जाए तो वह नवीनतम डेटा भी देखता है।सर्वोत्तम प्रथाओं - NSManagedObjectContextObjectsDidChangeNotification आईओएस

जिस तरह से मैंने समझ लिया है, वह एनएसएएनएजेड ओब्जेक्ट कॉन्टेक्स्टऑब्जेक्ट्सडिड चेंज नॉटिफिकेशन में नोटिफिकेशन सुनना है, दोनों मानचित्र दृश्य और कैलेंडर दृश्य में। यह एक प्रबंधित संदर्भ से सभी सम्मिलित, हटाए गए और अद्यतन ऑब्जेक्ट्स को वापस लौटता प्रतीत होता है, हर बार एक सहेजने पर। मैं इन वस्तुओं के माध्यम से जा सकता था और देख सकता हूं कि मुझे अपना विचार अपडेट करना है या नहीं।

MapViewController viewDidLoad में:: यह कैसे मैं इसे करने की सोच रहा हूँ है

[[NSNotificationCenter defaultCenter] 
    addObserver: self 
    selector: @selector(objectChangedNotificationReceived:) 
    name: NSManagedObjectContextObjectsDidChangeNotification 
    object: context]; 

तब:

- (void) objectChangedNotificationReceived: (NSNotification *) notification 
{ 
    NSArray* insertedObjects = [[notification userInfo] 
           objectForKey:NSInsertedObjectsKey] ; 
    NSArray* deletedObjects = [[notification userInfo] 
           objectForKey:NSDeletedObjectsKey] ; 
    NSArray* updatedObjects = [[notification userInfo] 
           objectForKey:NSUpdatedObjectsKey] ; 
    NSLog(@"insertObjects: %@", [insertedObjects description]); 
    NSLog(@"deletedObjects: %@", [deletedObjects description]); 
    NSLog(@"updatedObjects: %@", [updatedObjects description]); 

    for (NSManagedObject *obj in insertedObjects) { 
     if ([obj class] == [Location class]) { 
      NSLog(@"adding a new location"); 
      Location *locationObj = (Location *) obj; 
      [self.mapview addAnnotation: locationObj]; 
     } 
    } 
} 

इस अधिकार के बारे में लग रहा है? ऐसा लगता है कि प्रत्येक व्यू कंट्रोलर में डालने के लिए बहुत सारे अनावश्यक कोड की तरह लगता है, खासकर अगर मुझे एक से अधिक NSManagedObject में दिलचस्पी है। क्या कोई और तकनीक है जो मुझे याद आ रही है?

उत्तर

3

NSFetchedResultsController आपकी आवश्यकता फिट करने के लिए लगता है। यह कोर डेटा से डेटा हैंडलिंग को कुशलता से प्रबंधित करेगा। आप अपने कैलेंडर दृश्य नियंत्रक और मानचित्र दृश्य नियंत्रक दोनों के लिए एक ही fetch अनुरोध का पुन: उपयोग करते हैं।

+0

मैंने NSFetchedResultsController का उपयोग करके अंत किया, भले ही मेरे विचारों में उनके साथ जुड़े टेबलव्यू नहीं थे, और यह एक आकर्षण की तरह काम करता है! –

+0

@ZS जाहिर है, 'NSFetchedResultsController' को tableView से संबंधित नहीं होना चाहिए। –

2

आप क्यों नहीं बस नवीनतम डेटा सीधे CoreData से viewWillLoad या viewDidLoad विधि पर लाने नहीं कर सकते। यह सुनिश्चित करेगा कि आपके पास नवीनतम ऑब्जेक्ट्स हैं।

ऐसा लगता है कि यह अधिक मॉड्यूलर और क्लीनर होगा।

+1

बहुत अधिक ओवरहेड। एक एफआरसी बनाना जो आपके लिए परिवर्तनों को सुनता है वह रास्ता है। –

संबंधित मुद्दे