2012-04-03 18 views
13

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

अब मैं चाहता हूं कि मेरा ऐप इस कस्टम कैलेंडर से उन सभी घटनाओं को पढ़ सके। मेरी घटनाएं स्टार्टडेट और एंडडेट सेट के साथ बनाई गई हैं (एनएसडीएट आवंटित समय के साथ आवंटित)।

NSDate *startDate = [NSDate dateWithTimeIntervalSinceNow:- 60 * 60 * 24 * (365 * 4 + 1)]; 
NSDate *endDate = [NSDate dateWithTimeIntervalSinceNow:60 * 60 * 24 * 365 * 25]; 
NSArray *calendarList = [NSArray arrayWithObjects:tmpCal, nil]; 
NSPredicate *datePredicate = [store predicateForEventsWithStartDate:startDate endDate:endDate calendars:calendarList]; 
NSArray *eventList = [store eventsMatchingPredicate:datePredicate]; 

जैसा कि आप देख सकते हैं कि मैं एक समय अंतराल निर्दिष्ट कर रहा हूं जिसमें परिणामस्वरूप घटनाएं होनी चाहिए। जैसा कि आप भी देख सकते हैं, अंतिम तिथि अब से 25 साल में है जबकि अतीत में प्रारंभ तिथि 4 साल (और लीप वर्ष के लिए एक दिन) है। यदि मैं इस तरह से EKEventstore से पूछता हूं, तो मुझे पहले जोड़े गए ईवेंट मिल रहे हैं। मुश्किल हिस्सा तब शुरू होता है जब मैं अतीत में एक तिथि (या अधिक दिन या साल) शुरू करना चाहता हूं। फिर, अचानक, कोई घटना वापस नहीं आती है।

NSDate *startDate = [NSDate dateWithTimeIntervalSinceNow:- 60 * 60 * 24 * (365 * 4 + 2)]; 

क्या एनएसपीडइंटर में एनएसटीइम इंटरवल के नकारात्मक मूल्यों की सीमा है? मुझे कोई दस्तावेजी सीमाएं नहीं मिलीं। मुझे यह पता लगाने में लगभग 2 घंटे लग गए कि मुझे कोई घटना क्यों नहीं मिली (मूल रूप से मैं अतीत में 5 साल और भविष्य में 5 साल की अवधि चाहता था)। इस उत्सुक व्यवहार का कारण क्या है? कोई उपाय?

/04/11/2012 पर संपादित 2012/03/31 और 2012/04/20 पर एक प्रारंभिक तिथि के साथ कुछ घटनाओं बनाने के बाद यह किया है कि प्राप्त करने में कठिनाई अंतराल के साथ निर्धारित दिनांक से घटनाओं अब द्वारा सीमित है से लगता है 4 साल की अंतराल की लंबाई। उपरोक्त दिए गए कोड में मेरी प्रारंभ तिथि (एक दिन पहले प्रारंभ दिन सेट करके) समायोजित करना मैं 03/31/2012 तक घटनाएं प्राप्त करने में सक्षम था लेकिन बाद में नहीं। इस समायोजन को हटाने के परिणामस्वरूप 03/31/2012 और 04/01/2012 से घटनाएं प्राप्त हुईं (लेकिन 04/20/2012 से नहीं)। दूसरे समायोजन के बाद (20 दिनों बाद प्रारंभ तिथि को सेट करना) मुझे उन भविष्य की घटनाएं भी मिलीं।
मैं निर्दिष्ट नहीं कर सकता कि ऐसी सीमा क्यों है। हो सकता है कि कुछ आंतरिक गणनाएं हों जो उपयोग किए गए मान संग्रहण के अतिप्रवाह को जन्म देगी। केवल अनुमान है।

फिर मैं ऐप्पल उदाहरणों पर जाता हूं। पहली नज़र में मैं ऐप्पल की ईकेईवेंट प्रोग्रामिंग गाइड में दिए गए कोड का उपयोग नहीं करना चाहता था। यह मेरे जैसा प्यारा & जैसा नहीं दिख रहा था, लेकिन इतनी परेशानी के बाद मैंने इसे एक शॉट दिया।

CFGregorianDate gregorianStartDate, gregorianEndDate; 
CFTimeZoneRef timeZone = CFTimeZoneCopySystem(); 

gregorianStartDate.hour = 0; 
gregorianStartDate.minute = 0; 
gregorianStartDate.second = 0; 
gregorianStartDate.day = 1; 
gregorianStartDate.month = 4; 
gregorianStartDate.year = 2008; 

NSDateComponents *components = [[NSCalendar currentCalendar] components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit fromDate:[NSDate date]]; 
gregorianEndDate.hour = 23; 
gregorianEndDate.minute = 59; 
gregorianEndDate.second = 59; 
gregorianEndDate.day = [components day]; 
gregorianEndDate.month = [components month]; 
gregorianEndDate.year = [components year] + 1; 

NSDate *startDate = [NSDate dateWithTimeIntervalSinceReferenceDate:CFGregorianDateGetAbsoluteTime(gregorianStartDate, timeZone)]; 
NSDate *endDate = [NSDate dateWithTimeIntervalSinceReferenceDate:CFGregorianDateGetAbsoluteTime(gregorianEndDate, timeZone)]; 
CFRelease(timeZone); 

इस तरह से मुझे 04/01/2008 से अब तक (2 + वर्ष) तक की सभी घटनाएं मिलती हैं। खैर, यह पता चला कि एक ही सीमा का उपयोग यहां किया जाता है :(प्रारंभिक तारीख को समायोजित करने के परिणामस्वरूप मेरी घटनाओं का केवल एक हिस्सा प्राप्त हुआ, जब तक कि अंतिम घटनाएं उन 4 वर्षों की सीमा में न हों।

गहन शोध से पता चला कि यह व्यवहार बहुत लंबा समय मौजूद है: Fetch all events from EventStore EventKit iOS

+1

आप सफलतापूर्वक इस के आसपास इस 4 साल खिड़की चलती है और परिणाम के योग के द्वारा घटनाओं को इकट्ठा कर सकते हैं? – CuriousRabbit

+0

अच्छा, ऐसा करने के लिए कुछ जटिल काम दिखता है, लेकिन हाँ, यह शायद काम करना चाहिए। – TRD

+0

हाँ, असली पिटा की तरह दिखता है, लेकिन बस अपनी समस्या के लिए एक समाधान का सुझाव देने का प्रयास कर रहा है। – CuriousRabbit

उत्तर

0

कैलेंडरस्टोर की घटनाओं की इतनी बड़ी तिथि सीमा के लिए पूछना आम बात है। प्रदर्शन एक समय में एक महीने में भयानक खींच रहा है, और आप "सब" खींचना चाहते हैं निश्चित रूप से सलाह नहीं दी जाती है। कैलेंडरस्टोर को 'सब' के बारे में चिंता करने की ज़रूरत है, और आपको ध्यान देना चाहिए कि आपको जिस तारीख सीमा को खींचने की आवश्यकता है, उसे सही ढंग से कैसे दायरा करना है।

F या उदाहरण, यदि आपके पास एक समय में एक सामान्य कैलेंडर ऐप एक माह दिखा रहा है, तो बस 3 महीने (अपना लक्ष्य महीना, साथ ही महीने को अपने वर्तमान कैलेंडर के आगे और पीछे) खींचें। यदि अगले महीने कोई पृष्ठ है, तो उसके बाद महीने प्राप्त करने के लिए अनुरोध करें, और इसी तरह।

शायद आप 'सभी' घटनाओं को प्राप्त करने की अपनी इच्छा को चलाने के बारे में अधिक जानकारी प्रदान कर सकते हैं?

1

मैं जेम्स से सहमत हूं कि भविष्य में अब तक की तारीख के साथ बहुत सी घटनाओं को खींचने की सलाह नहीं दी जाती है, सौभाग्य से आप दूरस्थ भविष्य का उपयोग कर सकते हैं, अच्छी तरह से दूर की घटनाओं में खींचने के लिए।

यह स्पष्ट रूप से सभी घटनाओं को खींचता नहीं है बल्कि कई घटनाओं के रूप में स्मृति या अन्य मुद्दों के कारण बाहर हो सकता है।

NSDate *endDate = [NSDate distantFuture]; 

आशा में मदद करता है कि

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