2014-11-09 2 views
1

내가 권한이 달력 나는 그것을 실행하는 각 방법에 걸리는 시간을 표시하는 로그를 넣어 EKEventStore 블록 UI 스레드

을 편집하는 사용자를 요청하려고하고, 그것이 몇 밀리 초

을위한 것을 말한다

문제가 내가 권한을 요청 직후이며, UI 스레드는 로그가이 말을 분

이상 동안 차단 될 것 같다

2014-11-09 22:09:07.236 FixGift[60052:22b] I,-[EACalendarManager getLocalEventCalendarsWithHandler:]:91 
[fg16,179,176;before start request[; 
2014-11-09 22:09:08.795 App[60052:4607] I,__55-[EACalendarManager getLocalEventCalendarsWithHandler:]_block_invoke:101 
[fg16,179,176;before start callback[; 
2014-11-09 22:09:08.805 App[60052:4607] I,__42-[EANewEventViewController askPermission:]_block_invoke:433 
[fg16,179,176;before save event[; 
2014-11-09 22:09:08.807 App[60052:4607] I,__69-[EANewEventViewController saveEventToCalendarWithManager:eventInfo:]_block_invoke:443 
[fg16,179,176;created calendar[; 
2014-11-09 22:09:08.840 App[60052:60b] I,-[EABaseViewController dealloc]:106 
[fg16,179,176;deallocated:EABaseViewController[; 
2014-11-09 22:09:08.841 App[60052:60b] I,-[EABaseViewController dealloc]:106 
[fg16,179,176;deallocated:EABaseViewController[; 
2014-11-09 22:09:08.840 App[60052:4607] I,__42-[EANewEventViewController askPermission:]_block_invoke:435 
[fg16,179,176;after save event[; 
2014-11-09 22:09:08.842 App[60052:4607] I,__55-[EACalendarManager getLocalEventCalendarsWithHandler:]_block_invoke:107 
[fg16,179,176;after callback[; 

-(void)getLocalEventCalendarsWithHandler:(EACalendarManagerEventsCallback)callback{ 
    __weak typeof (self)weakself = self; 
    if(!self.eventsAccessGranted){ 
     LogInfo(@"before start request"); 
     [self.eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) { 

      if(!granted){ 
       NSLog(@"Error requesting access to events:%@",error); 
       if(callback){ 
        callback(granted,error,nil); 
       } 
       return ; 
      } 
      LogInfo(@"before start callback"); 
      NSArray *calendars =[weakself getLocalEventCalendars]; 

      if(callback){ 
       callback(granted,error,calendars); 
      } 
      LogInfo(@"after callback"); 
     }]; 
    }else { 
     NSArray *calendars =[self getLocalEventCalendars]; 
     if(callback){ 
      callback(YES,nil,calendars); 
     } 
    } 
} 

무엇 문제를 해결할 수 있습니까?

+1

콜백 코드를 표시하지 않지만 UI를 업데이트하는 경우 기본 대기열에 전달해야합니다. – Paulw11

+0

정답입니다! 고맙습니다. 답변을 올리면 받아 들일 것입니다. –

답변

0

완성 처리기가 백그라운드 스레드에서 실행됩니다. UI에 대한 모든 업데이트는 기본 대기열에서 수행되어야합니다.

콜백 블록 내부의 기본 대기열에 디스패치하거나 메인 대기열에서 콜백을 호출하는 것이 더 안전 할 수 있습니다.