我正在使用EventKit API来获取用户的提醒。 fetch API是异步完成的,当fetch完成时,你可以使用一个完成块。然而,在我获取用户的提醒之后,我将它分配给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();
}];
}
答案 0 :(得分:0)
你需要创建一个selfInBlock母猪,以确保你不会像这样放松对块内的self的引用
__block YourSelfClassName *selfInBlock = self;
并在块内使用selfInBlock而不是self。
答案 1 :(得分:0)
感谢我收到的所有答案/评论。我只是注意到我实际上是在设置另一个带有similair名称的实例变量,所以这就是为什么它是零。
自我注意:复制和粘贴代码时要非常小心:)