2013-10-14 7 views
10

मैं बस डिवाइस के कैलेंडर में कोई ईवेंट जोड़ना चाहता हूं।ईवेंट को कैलेंडर में बहुत धीमा करना

मैं उपयोग कर रहा हूँ:

__weak ProgramViewController *weakSelf = self; 

EKEventStore *store = [[EKEventStore alloc] init]; 

    [store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) 
    { 
     if (error) 
       NSLog(@"EKEventStore error = %@", error); 

     if (granted) 
     { 
      NSLog(@"EKEvent *event "); 

      EKEvent *event = [EKEvent eventWithEventStore:store]; 
      event.title = weakSelf.program.title; 
      event.location = weakSelf.program.locationPublic; 
      event.startDate = weakSelf.program.startTime; 
      event.endDate = weakSelf.program.endTime; 
      [event setCalendar:[store defaultCalendarForNewEvents]]; 
      NSError *err = nil; 
      [store saveEvent:event span:EKSpanThisEvent commit:YES error:&err]; 

      if (err) 
      { 
       UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Calendar Error" message:err.localizedDescription delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
       [alertView show]; 
      } 
      else 
      { 
       UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Added" message:@"Calendar event added." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
       [alertView show]; 
      } 
     } 
    }]; 

और iOS 6 में यह (एक iPhone 5 एस पर) 6/7 सेकंड (iPhone 4) और iOS 7 पर ले जा सकते हैं यह लेता है ~ 10 सेकंड। क्या यह सामान्य व्यवहार है? यदि नहीं तो मैं गलत क्या कर रहा हूं?

उत्तर

12

मुझे एक ही समस्या थी। जैस्पर के जवाब के लिए धन्यवाद, मुझे कतारों के बारे में सोच रहा था। इस प्रयास करें:

if (!err) 
    { 
     dispatch_async(dispatch_get_main_queue(), 
     ^{ 
      [[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"event added", nil) message:nil delegate:nil cancelButtonTitle:NSLocalizedString(@"ok", nil) otherButtonTitles:nil] show]; 
     }); 
    } 

यहाँ ऐसा क्यों की जरूरत है (जोर देखना)

चर्चा

iOS 6 में और बाद में, एक घटना की दुकान करने का अनुरोध पहुँच एसिंक्रोनस रूप से करने के लिए अपने उपयोगकर्ताओं को संकेत देता है अपने डेटा का उपयोग करने की अनुमति। उपयोगकर्ता को केवल पहली बार संकेत दिया जाता है कि आपका ऐप किसी इकाई प्रकार तक पहुंच का अनुरोध करता है; EKEventStore के बाद के किसी भी तत्काल इंस्टेंटेशन मौजूदा अनुमतियों का उपयोग करता है। जब उपयोगकर्ता पहुंच प्रदान करने या अस्वीकार करने के लिए टैप करता है, तो पूर्णता वाले हैंडलर को मनमाने ढंग से कतार पर बुलाया जाएगा। आपका ऐप अवरुद्ध नहीं है जबकि उपयोगकर्ता अनुमति देने या अस्वीकार करने का निर्णय लेता है।

चूंकि UIAlertView UIKit है, और UIKit को हमेशा मुख्य धागे की आवश्यकता होती है, कोई अन्य मनमाना धागा क्रैश हो जाएगा या अप्रत्याशित व्यवहार का कारण बन जाएगा।

https://developer.apple.com/library/ios/documentation/EventKit/Reference/EKEventStoreClassRef/Reference/Reference.html

+0

दिलचस्प है कि यह काम करता है - आप अभी भी मुख्य कतार में प्रेषण कर रहे हैं। –

+1

@JasperBlues मेरा संपादन देखें। – mmackh

+0

अच्छा काम। @daidai कृपया इस उत्तर को स्वीकार करने के लिए बदलें - बाद के दर्शकों के लिए अधिक उपयोगी होगा। –

2

दस्तावेज़ों के मुताबिक: "एक ईकेवेन्टस्टोर ऑब्जेक्ट को आरंभ करने और रिलीज़ करने के लिए अपेक्षाकृत बड़ी मात्रा की आवश्यकता होती है।"। । इसलिए आपको पृष्ठभूमि कतार पर इसे प्रेषित करना चाहिए।

इसके अलावा, विचित्र रूप से, पृष्ठभूमि कतार की तुलना में मुख्य कतार में अधिक समय लगता है - यह सुनिश्चित नहीं है कि यह क्यों है!

+0

बहुत अजीब बात है कि - मेरे परीक्षण में, यह मुख्य थ्रेड पर 30 सेकंड है, जो समय के दौरान अपने यूआई अवरुद्ध है का समय लग सकता है, जबकि एक और धागा में रख और यह काफी तत्काल है ! – siburb

+0

मुझे 40000 घटनाओं को सहेजना है और मैं पृष्ठभूमि कतार का उपयोग कर रहा हूं, क्या यह हासिल करने के लिए कोई प्रदर्शन अनुकूल दृष्टिकोण है? – Mrug

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