0

我有一种情况,我需要等到一个块完成,然后才继续使用我的代码,因为我使用 CFRunLooprun 并停止这是如何做的,我将在我的代码中的注释中解释更多内容

 [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);




    }


}
4

1 回答 1

0

你不能这样做——你必须调用你的函数,然后在异步调度的完成块中,最后,调用一个继续你想做的事情的函数。

在您上面的代码中,您将异步编程与同步执行混为一谈,这是行不通的。

于 2013-08-16T09:14:43.473 回答