2013-10-14 6 views
10

단순히 디바이스의 캘린더에 이벤트를 추가하려고합니다. ~이 걸리는 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가 (아이폰 5S에) 6/7 초 (아이폰 4) 및 iOS 7을 수행 할 수 있습니다

내가 사용하고 있습니다. 이것은 정상적인 행동입니까? 내가 뭘 잘못하고 있는거야?

답변

12

나는 동일한 문제가있었습니다. Jasper의 대답 덕분에 대기열에 대해 생각해 보았습니다. 이 시도 :이 필요한 이유

다음
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]; 
     }); 
    } 

이야 (강조 참조)

토론

아이폰 OS 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

- 내 테스트에서, 그것은 반면에, 당신의 UI가 차단되는 시간 동안 메인 스레드에서 30 초까지 걸릴 다른 스레드에 넣어 그것은 거의 즉각적 수 ! – siburb

+0

40000 개의 이벤트를 저장해야하며 이미 백그라운드 큐를 사용하고 있습니다.이를 달성하기위한 성능 친화적 접근 방법이 있습니까? – Mrug