2013-08-16 9 views
0

저는 한 블록이 완료 될 때까지 기다릴 필요가있는 상황을 가지고 있습니다. 그리고 CFRunLooprun을 사용하여 코드를 앞으로 옮기고 멈추십시오. 어떻게하면 코멘트에 더 많은 것들을 설명 할 수 있습니까? 내 코드에문제가 실행 중이고 멈추고 있습니다. CFRunLoop

[self fatchAllEvent]; // BLOCK IS IN THIS METHOD 

    NSLog(@"loop will start"); 
    CFRunLoopRun(); 


    NSLog(@"LOOP IS STOOPED"); 

-(void)fatchAllEvent{ 


    events = [[NSMutableArray alloc]init]; 


// // Get the appropriate calendar 
    NSCalendar *calendar = [NSCalendar currentCalendar]; 


    eventStore = [[EKEventStore alloc] init]; 

    if ([eventStore respondsToSelector:@selector(requestAccessToEntityType:completion:)]) 
    { 
//  __block typeof (self) weakSelf = self; // replace __block with __weak if you are using ARC 
     dispatch_async(dispatch_get_main_queue(), ^{ 
        [eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) 
     { 

      if (granted) 
      { 

       [events removeAllObjects]; 
       NSLog(@" granted"); 
       NSLog(@"User has granted permission!"); 
       // Create the start date components 
       NSDateComponents *twoYearAgoComponents = [[NSDateComponents alloc] init]; 
       twoYearAgoComponents.year = -2; 
       NSDate *oneDayAgo = [calendar dateByAddingComponents:twoYearAgoComponents 
                   toDate:[NSDate date] 
                   options:0]; 

       // Create the end date components 
       NSDateComponents *twoYearFromNowComponents = [[NSDateComponents alloc] init]; 
       twoYearFromNowComponents.year = 2; 
       NSDate *oneYearFromNow = [calendar dateByAddingComponents:twoYearFromNowComponents 
                    toDate:[NSDate date] 
                    options:0]; 

       // Create the predicate from the event store's instance method 
       NSPredicate *predicate = [eventStore predicateForEventsWithStartDate:oneDayAgo 
                       endDate:oneYearFromNow 
                      calendars:nil]; 

       // Fetch all events that match the predicate 
       events =(NSMutableArray*) [eventStore eventsMatchingPredicate:predicate]; 
       NSLog(@"The content of array is%@",events); 



      } 
      else 
      { 
       NSLog(@"Not granted"); 



      } 
       NSLog(@"LOOP WILL STOP"); // THIS GETS PRINT 
       CFRunLoopStop(CFRunLoopGetCurrent()); // BUT LOOP IS NOT STOPPING HERE SO MY APP JUST GET HANGED ; 
     }]; 

       }); 
    } 
    else 
    { 

     [events removeAllObjects]; 

     NSLog(@"Autometiclly granted permission!"); 
     // Create the start date components 
     NSDateComponents *twoYearAgoComponents = [[NSDateComponents alloc] init]; 
     twoYearAgoComponents.year = -2; 
     NSDate *oneDayAgo = [calendar dateByAddingComponents:twoYearAgoComponents 
                 toDate:[NSDate date] 
                options:0]; 

     // Create the end date components 
     NSDateComponents *twoYearFromNowComponents = [[NSDateComponents alloc] init]; 
     twoYearFromNowComponents.year = 2; 
     NSDate *oneYearFromNow = [calendar dateByAddingComponents:twoYearFromNowComponents 
                  toDate:[NSDate date] 
                  options:0]; 

     // Create the predicate from the event store's instance method 
     NSPredicate *predicate = [eventStore predicateForEventsWithStartDate:oneDayAgo 
                    endDate:oneYearFromNow 
                    calendars:nil]; 

     // Fetch all events that match the predicate 
     events =(NSMutableArray*) [eventStore eventsMatchingPredicate:predicate]; 
     NSLog(@"The content of array is%@",events); 




    } 


} 

답변

0

당신은이 방법을 수행 할 수 없습니다 - 당신은 당신의 함수를 호출해야하고 비동기 발송 완료 블록에서, 끝에서, 당신이 원하는 것을 계속 함수를 호출 할 것.

위의 코드에서 비동기 프로그래밍과 동기 실행을 혼합하면 작동하지 않습니다.

+0

만약 내가 그 기능을 또한 그 대기 단계로 이동하고 내 현재의 방법을 계속 실행하고 null을 반환합니다 그럼 내가 원하지 않아요 –

+0

그것은 당신이 원하지 않는 것이지만 그게 그것 일 수 있습니다 비동기 프로그래밍과 함께 작동합니다. 유일한 다른 방법은 실행 스레드 (아마도 당신의 경우에는 주 스레드)를 차단하는 것이고, 그것은 정말로 - 그리고 나는 정말로 나쁜 디자인과 끔찍한 사용자 경험을 의미합니다. – TheEye