1

EKEventStore クエリからのイベントの保存に問題があります。たとえば、次のコードを使用する場合、eventsは常に nil です。

__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 に答える