我有这样的情况,我需要等到一个块完成,然后只用我的代码继续前进,我使用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);
}
}
答案 0 :(得分:0)
你不能这样做 - 你必须调用你的函数,然后在异步调度的完成块中,最后调用一个继续你想做的函数。
在上面的代码中,你将异步编程与同步执行混为一谈,这是行不通的。