我在存储来自EKEventStore查询的事件时遇到了问题。例如,在使用以下代码时,事件总是为零:
__block NSArray *events = [[NSArray alloc] init];
if ([eventStore respondsToSelector:@selector(requestAccessToEntityType:completion:)]) {
[eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
dispatch_async(dispatch_get_main_queue(), ^{
if (granted)
events = [eventStore eventsMatchingPredicate:predicate];
});
}];
}我知道eventStore events eventsMatchingPredicate:谓词是返回事件,就好像我在块中放置了一个NSLog一样,然后我可以看到事件的详细信息。保留结果似乎有问题。如你所见,我试过在主线程上做它,但没有结果。
我正在使用ARC,这可能会产生不同的效果。
谢谢
发布于 2013-03-30 08:08:25
当然可以..我的意思是,在我的requestAccessToEntity块之后,我正在做“返回事件”。这是没有好处的,因为它将立即返回,因为requestAccessToEntity块是异步的,并且需要很短的时间来执行该操作。因此,我做了一个委托,并在requestAccessToEntity完成后调用这个委托,这样它就会在完成时通知我,并在委托调用中传回数组。就像这样:
[eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
if (granted) {
if (delegate != nil && [delegate respondsToSelector:@selector(todaysEventsComplete:)]) {
events = [eventStore eventsMatchingPredicate:predicate];
dispatch_async(dispatch_get_main_queue(), ^{
[delegate todaysEventsComplete:events];
});
} else {
dispatch_async(dispatch_get_main_queue(), ^{
[UIAlertView alertViewWithTitle:nil message:@"You have denied access to your calendar for this app"];
});
}
}
}];发布于 2012-10-13 14:39:42
终于弄明白了。
我在返回NSArray事件的方法中执行上述代码。现在的问题是requestAccessToEntityType是异步执行的。因此,即使在块本身中,我正在更新主线程上的数组,但此时已经太晚了,因为方法已经返回。
必须对其进行更改,以便它现在有一个委托,在它完成任务后返回事件。
https://stackoverflow.com/questions/12867535
复制相似问题