2012-08-30 20 views
8

कहा जाता है मैं अपने ऐप में EKEventStore का उपयोग कर रहा हूं। जब मैं कैलेंडर में परिवर्तन करता हूं तो अधिसूचित होने के लिए मैं डिफॉल्ट स्टोर लेता हूं और EKEventStoreChangedNotification के लिए पंजीकरण करता हूं। हालांकि, जब कोई परिवर्तन किया जाता है, तो अधिसूचना के प्रेषक को कई कॉल (5-10) बार कहा जाता है, कभी-कभी प्रत्येक कॉल के बीच 15 सेकंड तक। यह मेरे कोड को गड़बड़ कर देता है और चीजों को काम करने में और अधिक कठिन बनाता है। क्या मैं इसके बारे में कुछ कर सकता हूं?EKEventStoreChangedNotification कई बार

धन्यवाद

iOS7 संपादित करें: ऐसा लगता है कि iOS7 जारी होने के बाद, इस समस्या को गायब हो गया है। अब, कैलेंडरस्टोर में किए गए परिवर्तन की परवाह किए बिना, केवल एक EKEventStoreChangedNotification भेजा जाता है।

उत्तर

16

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

अपना कोड देखने के बिना और क्या परिवर्तन किए जा रहे हैं, मैं जवाब के बारे में बहुत विशिष्ट नहीं हो सकता; हालांकि, सामान्य रूप से, आपके पास दो विकल्प होते हैं।

  1. और अधिक बारीकी से परिवर्तन को ध्यान से देखें - हो सकता है आप सुरक्षित रूप से कुछ नोटिफिकेशन को अनदेखा कर सकते हैं अगर वे घटनाओं है कि आपका ऐप से संबंधित नहीं है चिंता का विषय है, या आप पहले से ही किसी विशेष आइटम के लिए एक परिवर्तन संभाला है यदि।
  2. कोलेलेस एकाधिक हैंडलर कोड के एक बैच में बदल जाता है। असल में, जब आपको अधिसूचना मिलती है, तो तुरंत अपनी प्रतिक्रिया को दूर करने की बजाय, एक टाइमर शुरू करें जो प्रतिक्रिया को दूसरे या दो में चलाएगा। फिर, यदि टाइमर आग से पहले एक और अधिसूचना आती है, तो आप टाइमर को रद्द कर सकते हैं और इसे रीसेट कर सकते हैं। इस तरह, आप एक छोटी सी विंडो में आने वाली कई अधिसूचनाओं को बैच कर सकते हैं और केवल एक बार जवाब दे सकते हैं (जब टाइमर अंत में आग लगती है)।

बाद समाधान मेरी पसंदीदा जवाब है, और इस तरह के (अस्थायी रूप से सूत्रण चिंताओं की अनदेखी) कुछ दिख सकता है:

@property (strong) NSTimer *handlerTimer; 

- (void)handleNotification:(NSNotification *)note { 
    // This is the function that gets called on EKEventStoreChangedNotifications 
    [self.handlerTimer invalidate]; 
    self.handlerTimer = [NSTimer timerWithTimeInterval:2.0 
               target:self 
               selector:@selector(respond) 
               userInfo:nil 
               repeats:NO]; 
    [[NSRunLoop mainRunLoop] addTimer:self.handlerTimer 
           forMode:NSDefaultRunLoopMode]; 
} 

- (void)respond { 
    [self.handlerTimer invalidate]; 
    NSLog(@"Here's where you actually respond to the event changes"); 
} 
+1

बस एक त्वरित धन्यवाद, और एक प्रतिक्रिया: आईओएस व्यवहार आप 8.4.1 के साथ ध्यान दिया (प्रत्येक परिवर्तन के लिए कम से कम 2 अधिसूचनाओं को निकाल दिया गया) अभी भी बहुत सच है और आपका एन। 2 समाधान मेरे लिए अद्भुत काम किया; मुझे यकीन नहीं है कि समाधान एन। 1 को EKEventStoreChangedNotification पर लागू किया जा सकता है, हालांकि, इन अधिसूचनाओं में यह वर्णन नहीं किया गया है कि EKEventStore में क्या परिवर्तन हुआ। तो, समाधान एन। 2 जाने का रास्ता है! – cdf1982

+0

मुझे आईओएस 9 पर एक ही समस्या है –

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