2011-01-28 7 views
5

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

मेरे पास NSManagedObject है Patient और दूसरा Medication कहलाता है। Patient में कई Medications हो सकते हैं, और Medication में startOn और endOn तिथियां हैं।

मैं किसी भी तरह सभी Medication वस्तुओं की संपत्ति में परिवर्तनों को सुनना चाहता हूं। जब कोई परिवर्तन होता है, तो मैं आईओएस डिवाइस पर एक स्थानीय अधिसूचना शेड्यूल करना चाहता हूं। मैंने पहले स्थानीय अधिसूचनाओं के साथ काम किया है, लेकिन इस संदर्भ में इसके लिए कोड कहां रखना है, यह नहीं पता।

क्या मैं ऐप प्रतिनिधि में शेड्यूलिंग कोड बना सकता हूं और किसी भी तरह से Medication ऑब्जेक्ट्स में परिवर्तनों को सुनने के लिए ऐप प्रतिनिधि को पंजीकृत कर सकता हूं? क्या इसे NSManagedObjectContext से जोड़ा जाना चाहिए?

यह कैसे किया जाता है? पॉइंटर्स की बहुत सराहना की जाएगी!

धन्यवाद!

उत्तर

7

मुख्य मूल्य के साथ, आपको पर्यवेक्षण करने के लिए कुछ उदाहरण की आवश्यकता है। कभी-कभी वह वही ऑब्जेक्ट हो सकता है जो कॉल -setEndOn: दवा पर; कभी-कभी इसे कुछ और होना पड़ सकता है। आइए मान लें कि आपके ऐप में एक दवा प्रबंधक वर्ग है - जिसमें से एक उदाहरण बनाया गया है। और, आगे मान MedicationManager एक उदाहरण विधि -createMedicationWithName है: startOn: Endon: इस तरह:

- (Medication*) createMedicationWithName:(NSString*)medName startOn:(NSDate*)startDate endOn:(NSDate*)endDate 
    { 
    // Create and configure a new instance of the Compound entity 
    Medication *newMedication = (Medication *)[NSEntityDescription insertNewObjectForEntityForName:@"Medication" 
               inManagedObjectContext:[self managedObjectContext]]; 
    [newMedication setName:medName]; 
    [newMedication setStartOn:startDate]; 
    [newMedication setEndOn:endDate]; 

    // Set up KVO 
    [newMedication addObserver:self 
        forKeyPath:@"endOn" 
        options:NSKeyValueObservingOptionNew 
        context:nil]; 

    return newCompound; 
    } 


- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object 
                change:(NSDictionary *)change 
                context:(void *)context 
    { 
    if ([keyPath isEqualToString:@"endOn"]) 
     { 
     // ... schedule local notification on the iOS device for (Medication*)object. 
     return; 
     } 
    } 

या ऐसा ही कुछ।

नोट, जब आप एक दवा हटाते हैं, तो आप ऑब्सर्वर को हटाना चाहते हैं ... साथ ही, जब आप अपना ऐप लॉन्च करते हैं, तो आपको दवाइयों को मौजूदा दवाओं के लिए पर्यवेक्षक के रूप में स्थापित करने की आवश्यकता होगी। मुझे लगता है कि यह सभी दवाओं के पुनरावृत्ति के रूप में सरल हो सकता है और प्रत्येक के लिए addObserver को कॉल कर सकता है। यदि आपके पास कई दवाएं हैं, तो हो सकता है कि आप इसे अधिक 'आलसी' तरीके से करना चाहें (यानी, in -awakeFromFetch)।

+0

कैसे आप 'observeValueForKeyPath अंदर' endOn' का मूल्य मिलेगा अपडेट करने की क्षमता प्रदान करता है ' – daidai

+0

'id newValue = [बदलें ऑब्जेक्टफोरकी: NSKeyValueChangeNewKey] का उपयोग करके;' रिटर्न 'शून्य' – daidai

+1

"या ऐसा कुछ।" - यह एक अच्छा है! ;) –

3

जब ऑब्जेक्ट को पहली बार स्टोर के साथ ही बनाया जाता है तो ऑब्जेक्टर्स को पंजीकृत करना होगा। जब आप पहली बार प्राप्त करते हैं तो सभी प्रविष्टियों के माध्यम से लूप होने के बजाय (जो विशेष रूप से आईफोन पर त्रुटि प्रवण होता है, जब अनमोडिफाइड प्राप्त वस्तुओं को बनाए रखा नहीं जा सकता है) तो जागृत करें FromFetch और awakeFromInsert संदेशों का उपयोग करें।

इसके अलावा, नीचे दिए गए उदाहरण कोड में आप रोगी की कुल जानकारी जैसे जल्द से जल्द शुरूआत कर सकते हैं और जल्द से जल्द अंत में रोगी पर क्षणिक गुण बनाकर इस जानकारी को स्टोर कर सकते हैं। निम्नलिखित कोड दवा में Endon में परिवर्तन का अवलोकन करता है और आप रोगी ऊपर उल्लिखित क्षणिक "Endon soonest" या "soonest startOn"

- (void)addMyObservers 
{ 
    registeredObservers_ = YES; 
    [self addObserver:self forKeyPath:@"endOn" options:NSKeyValueObservingOptionNew context:nil]; 
} 

- (void)awakeFromInsert 
{ 
    // called when you create this object 
    [super awakeFromInsert]; 
    [self addMyObservers]; 
} 

- (void)awakeFromFetch 
{ 
    // called when you fetch this old object from the store 
    [super awakeFromFetch]; 
    [self addMyObservers]; 
} 

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
    if([keyPath isEqualToString:@"endOn"]) 
    { 
     id newValue = [change objectForKey:NSKeyValueChangeNewKey]; 
     // someone changed endOn so do something with this "newValue" 
     // check to see if the Patient needs the transient property for the soonest medication updated 
     // update any local notification schedule 
    } 
} 

// this is only required if you want to update the Patient's transient property for the soonest endOn or 
- (void)setPatient:(Patient *)patient 
{ 
    [self willChangeValueForKey:@"patient"]; 
    [self setPrimitivePatient:patient]; 
    [self didChangeValueForKey:@"patient"]; 

    // check to see if the Patient needs the transient property for the soonest medication updated 
} 
+0

'id newValue = [ऑब्जेक्ट बदलें फॉरकी: NSKeyValueChangeNewKey] का उपयोग करके;' रिटर्न 'शून्य' - मैं परिणाम कैसे प्राप्त कर सकता हूं? – daidai

+0

अपने सभी अन्य कोड को देखे बिना मैं सिद्धांत को सक्षम नहीं कर पाऊंगा, स्रोत कोड के साथ एक नया प्रश्न पोस्ट करने का प्रयास करें। उपरोक्त उत्तर के मेरे संस्करण में मुझे newValue के लिए शून्य नहीं मिलता है –

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