1

EventKit API を使用して、ユーザーのリマインダーを取得しています。フェッチ API は非同期で実行され、フェッチが完了すると、使用できる完了ブロックがあります。ただし、ユーザーのリマインダーをフェッチした後、それを self.eventKitReminderEvents インスタンス変数に割り当てます (デバッグしたところ、nil ではないことがわかりました)。次に、ブロックを呼び出した直後ですが、このブロック内から self.eventKitReminderEvents はnilです。なぜそれが起こっているのか、私にはよくわかりません。誰かが私のコードを見て、手がかりを教えてくれるかもしれません。

私はこのようなAPIを使用しています:

- (void)futureReminders {

    dispatch_semaphore_t sema = dispatch_semaphore_create(0);

    [self fetchReminderEventsInBackgroundFromDate:[NSDate date] withCompletionBlock:^{

        // When I enter here self.eventKitReminderEvents is nil
        // Which is weird because it should be set already if you look in
        // fetchReminderEventsInBackgroundFromDate below...

        [self processEventKitRemindersWithCompletion:^(NSArray *reminderEvents) {

            // Save a copy in memory
            self.futureReminderEvents = reminderEvents;

            // Send a signal that indicates that this asynchronous task is completed ...
            dispatch_semaphore_signal(sema);
         }];
    }];

    // Wait for dispatch signal
    dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);

}

- (void)fetchReminderEventsInBackgroundFromDate:(NSDate *)startDate withCompletionBlock:(void(^)(void))block {

    DLogName()

    //NSDate *startDate = [NSDate date];
    NSDate *endDate = [NSDate distantFuture]; // This will get me events 4 years from now

    // Create the predicate
    NSPredicate *predicate = [self.eventStore predicateForIncompleteRemindersWithDueDateStarting:startDate ending:endDate calendars:nil];

    [self.eventStore fetchRemindersMatchingPredicate:predicate completion:^(NSArray *reminders) {

        self.eventKitReminderEvents = reminders;
        block();
    }];
}
4

2 に答える 2

0

このようにブロック内で自己への参照を失わないように、selfInBlock sow を作成する必要があります。

__block YourSelfClassName *selfInBlock = self;

ブロック内で self の代わりに selfInBlock を使用します。

于 2013-02-13T15:50:39.647 に答える
0

私が受け取ったすべての回答/コメントに感謝します。私は実際に似た名前の別のインスタンス変数を設定していたことに気づいたので、それがnilでした.

自分へのメモ: コードをコピーして貼り付けるときは十分に注意してください :)

于 2013-02-14T11:51:47.023 に答える