And*_*rew 0 cocoa-touch objective-c ios objective-c-blocks
我正在尝试搜索提醒列表,以检查是否存在提醒.方法中有一个选项可以保存提醒是否存在的值.我正在使用一个块,并且在块内,当找到提醒时,新值被赋予reminderExists变量,就像它应该的那样.但是,当我输入save if语句时,其值reminderExists已从块中指定的值更改.我对这个问题很难过,我已经尝试了很多改变来诊断问题,但没有用.谢谢你的帮助!
- (BOOL)checkForReminderWithTitle:(NSString *)reminderTitle saveChanges:(BOOL)save {
NSNumber *currentGardenCurrentReminders = currentGarden.reminders;
__block NSNumber *reminderExists = [NSNumber numberWithBool:NO];
if (eventStore == nil)
{
eventStore = [[EKEventStore alloc] init];
[eventStore requestAccessToEntityType:EKEntityTypeReminder completion:^(BOOL granted, NSError *error) {
if (!granted)
NSLog(@"Access to store not granted");
}];
}
if (eventStore != nil) {
NSPredicate *predicate = [eventStore predicateForIncompleteRemindersWithDueDateStarting:[NSDate distantPast] ending:[NSDate distantFuture] calendars:[NSArray arrayWithObject:[eventStore defaultCalendarForNewReminders]]];
[eventStore fetchRemindersMatchingPredicate:predicate completion:^(NSArray *reminders) {
for (EKReminder *reminder in reminders) {
NSLog(@"%@", reminderTitle);
if ([reminder.title isEqualToString:reminderTitle]) {
reminderExists = [NSNumber numberWithBool:YES];
NSLog(@"reminder exists");
NSLog(@"after reminder exists is assigned to YES, value is %@", ([reminderExists boolValue]) ? @"True" : @"False");
if ([reminderExists boolValue]) NSLog(@"reminder exists variable works");
NSArray *alarms = reminder.alarms;
EKAlarm *alarm = [alarms objectAtIndex:0];
NSDateFormatter *nextReminderDateFormatter = [[NSDateFormatter alloc] init];
nextReminderDateFormatter.dateFormat = @"MM/dd/yyyy at hh:mm a";
NSString *nextReminderDateString = [nextReminderDateFormatter stringFromDate:alarm.absoluteDate];
NSLog(@"Next reminder is on %@", nextReminderDateString);
break;
}
}
}];
}
if (save && ([currentGardenCurrentReminders boolValue] != [reminderExists boolValue])) {
if ([reminderExists boolValue]) {
NSLog(@"within save, reminderexists == true");
} else NSLog(@"within save, reminderexists == false");
currentGarden.reminders = reminderExists;
[self.managedObjectContext save:nil];
}
return [reminderExists boolValue];
Run Code Online (Sandbox Code Playgroud)
}
调用fetchRemindersMatchingPredicate:completion:是异步的.这意味着if此调用之后的语句实际上是在调用完成之前很久fetchRemindersMatchingPredicate:completion:完成的.
在执行异步处理的方法中,您不能拥有有用的返回值.您需要更改您的checkForReminderWithTitle:saveChanges:方法以返回void,而是让它传递完成块,该完成块将在调用完成时调用fetchRemindersMatchingPredicate:completion:.
顺便说一句 - 为什么是reminderExists一个NSNumber指针而不只是一个BOOL?
| 归档时间: |
|
| 查看次数: |
149 次 |
| 最近记录: |