2013-08-16 55 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