Ios __块变量更改值
我正在尝试搜索提醒列表,以检查是否存在提醒。方法中有一个选项,用于保存提醒是否存在的值。我使用的是一个块,在该块中,当找到提醒时,新的值被分配给Ios __块变量更改值,ios,objective-c,cocoa-touch,objective-c-blocks,Ios,Objective C,Cocoa Touch,Objective C Blocks,我正在尝试搜索提醒列表,以检查是否存在提醒。方法中有一个选项,用于保存提醒是否存在的值。我使用的是一个块,在该块中,当找到提醒时,新的值被分配给rementerexists变量,就像它应该的那样。但是,当我输入saveif语句时,rementerexists的值与在块中分配的值不同。我被这个问题难住了,我尝试了很多改变来诊断这个问题,但都没有成功。谢谢你的帮助 - (BOOL)checkForReminderWithTitle:(NSString *)reminderTitle saveChan
rementerexists
变量,就像它应该的那样。但是,当我输入saveif语句时,rementerexists
的值与在块中分配的值不同。我被这个问题难住了,我尝试了很多改变来诊断这个问题,但都没有成功。谢谢你的帮助
- (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];
}对
[EKEventStore fetchRemindersMatchingPredicate:completion://的调用是异步的。因此,当您检查完成块下方的rementerexists
值时,完成块可能尚未执行,rementerexists
可能尚未具有正确的值
要解决此问题,请将检查代码放在完成块的末尾。正如@rmaddy正确指出的,此函数无法返回值,因为它依赖于异步调用。对[EKEventStore FetchEmlerationsMatchingPredicate:completion:
的调用是异步的。因此,当您检查完成块下方的rementerexists
值时,完成块可能尚未执行,rementerexists
可能尚未具有正确的值
要解决此问题,请将检查代码放在完成块的末尾。正如@rmaddy正确指出的那样,此函数无法返回值,因为它依赖于异步调用。对FetchMembersMatchingPredicate:completion:
的调用是异步的。这意味着您在此调用之后的if
语句实际上是在对fetchemendersmatchingpredicate:completion:
的调用完成之前很久完成的
在执行异步处理的方法中不能有有用的返回值。您需要更改标题为saveChanges:
的checkforemendorwhithtitle:saveChanges:
方法以返回void
,并让它通过一个完成块,该完成块将在调用fetchemendorsmatchingpredicate:completion:
时被调用
顺便说一句-为什么
提醒存在一个NSNumber
指针而不仅仅是BOOL
?调用获取提醒匹配谓词:完成:
是异步的。这意味着您在此调用之后的if
语句实际上是在对fetchemendersmatchingpredicate:completion:
的调用完成之前很久完成的
在执行异步处理的方法中不能有有用的返回值。您需要更改标题为saveChanges:
的checkforemendorwhithtitle:saveChanges:
方法以返回void
,并让它通过一个完成块,该完成块将在调用fetchemendorsmatchingpredicate:completion:
时被调用
顺便说一句-为什么rementerexists
是一个NSNumber
指针,而不仅仅是一个BOOL
?只需在块中移动if
语句,就不会处理此方法试图返回异步计算的值的事实。@rmaddy您说得对,先生。我刚刚澄清了我的答案。仅在块中移动if
语句并不能处理此方法试图返回异步计算的值的事实。@rmaddy您是对的,先生。我刚刚澄清了我的答案。rementerexists
最初是一个BOOL
,但是,在调试过程中,我认为不使用对象可能是问题的一部分。但是,我将if(save)
语句移到了块中,如果我的for
循环未找到提醒,我将如何执行保存?如果eventStore==nil
,则需要相同的“保存”代码。创建一个具有相同逻辑的方法,您可以从需要调用该方法的两个位置调用该方法。rementerexists
最初是一个BOOL
,但是,在调试过程中,我认为不使用对象可能是问题的一部分。但是,我已将if(save)
语句移到块中,如果我的for
循环未找到提醒,我将如何执行保存?如果eventStore==nil
,则需要相同的“保存”代码。创建一个具有相同逻辑的方法,您可以从需要调用该方法的两个位置调用该方法。