2013-10-14 41 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它可以採取6/7秒(iPhone 4)和iOS 7(在iPhone 5S)需要約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

根據文檔:「EKEventStore對象需要相對較多的時間來初始化和釋放。」。 。所以你應該在後臺隊列上調度它。

另外,奇怪的是,它在主隊列上比在背景隊列中需要更長的時間 - 不知道這是爲什麼!

+0

那是很奇怪的事情 - 在我的測試中,它可能需要長達主線程30秒,在此期間,您的UI被阻塞,而把它放在另一個線程,這是非常直接的! – siburb

+0

我必須保存40000個事件,並且我已經使用後臺隊列,有沒有任何性能友好的方法來實現這一目標? – Mrug