问题是运行和停止CFRunLoop

issue is running and stopping CFRunLoop

本文关键字:CFRunLoop 运行 问题是      更新时间:2023-10-16

我有这样的情况,我需要等待一个块完成,然后只继续我的代码,为此我使用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);


    }

}

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

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