__block变量更改值

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)

}

rma*_*ddy 5

调用fetchRemindersMatchingPredicate:completion:是异步的.这意味着if此调用之后的语句实际上是在调用完成之前很久fetchRemindersMatchingPredicate:completion:完成的.

在执行异步处理的方法中,您不能拥有有用的返回值.您需要更改您的checkForReminderWithTitle:saveChanges:方法以返回void,而是让它传递完成块,该完成块将在调用完成时调用fetchRemindersMatchingPredicate:completion:.

顺便说一句 - 为什么是reminderExists一个NSNumber指针而不只是一个BOOL