1

我在存储来自 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 eventsMatchingPredicate:predicate] 正在返回事件,就好像我将 NSLog 放在块内一样,然后我可以看到事件详细信息。保留结果似乎存在问题。如您所见,我尝试在主线程上执行此操作但无济于事。

我正在使用可能会有所作为的 ARC。

谢谢

4

2 回答 2

1

当然.. 我的意思是在我的 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"];
            });
        }
    }
}];
于 2013-03-30T08:08:25.830 回答
0

终于想通了。

我在返回 NSArray 事件的方法中执行上述代码。现在的问题是requestAccessToEntityType异步执行的。因此,即使在块本身中我正在更新主线程上的数组,但此时为时已晚,因为该方法已经返回。

不得不改变它,所以它现在有一个委托,一旦它完成它的事情就会返回事件。

于 2012-10-13T14:39:42.153 回答