Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios __块变量更改值_Ios_Objective C_Cocoa Touch_Objective C Blocks - Fatal编程技术网

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
,则需要相同的“保存”代码。创建一个具有相同逻辑的方法,您可以从需要调用该方法的两个位置调用该方法。