iOS возвращает логическое значение в блоке

Я пытаюсь вернуть логическое значение из метода класса, который я вызываю, в котором есть блок. Я получаю сообщение об ошибке: Отправка несовместимых типов указателей блоков... Как мне обойти это? Я просто хочу знать, завершается ли метод класса, который я вызываю, с ошибкой или без нее...

+ (BOOL)saveSelectedDepartmentsToParse:(NSMutableDictionary *)dictionary {

    NSArray *array = [dictionary allKeysForObject:@"YES"];
    NSMutableArray *trimmedArray = [[NSMutableArray alloc] init];

    for (NSString *string in array) {

        NSString *final = [string removeAllInvalidCharacters];
        [trimmedArray addObject:final];
    }

    NSLog(@"Array = %@", trimmedArray);

    PFInstallation *currentInstallation = [PFInstallation currentInstallation];

    [currentInstallation removeObjectForKey:@"channels"];
    [currentInstallation addObjectsFromArray:trimmedArray forKey:@"channels"];
    [currentInstallation saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {

        if (error == nil) {

            NSLog(@"Parse Save Succeeded");

            [self saveDepartmentsDictionary:dictionary];
        }
        else {

            NSLog(@"Parse Save Failed, %@", error.localizedDescription);
        }
    }];
}

person Jon Erickson    schedule 13.03.2013    source источник
comment
Покажите нам объявление метода saveInBackgroundWithBlock:.   -  person CodaFi    schedule 13.03.2013
comment
У меня нет доступа к этому. Это часть структуры Parse.com.   -  person Jon Erickson    schedule 13.03.2013
comment
Все, что у меня есть, это: parse.com/ docs/ios/api/Classes/PFObject.html#//api/имя/:   -  person Jon Erickson    schedule 13.03.2013


Ответы (2)


Я просто хочу знать, является ли метод класса, который я вызываю,

Это неправильное понимание того, как работает асинхронный код. Когда вы передаете блок saveInBackgroundWithBlock:, этот код не выполняется сразу. Он выполняется в какой-то более поздний момент инфраструктурой Parse, и любая часть Parse, которая это делает, получит возвращаемое значение, если блок был определен как имеющий его, а это не так. Ваш блок не выполняется в тот момент, когда вы его пишете, поэтому вы не можете ничего вернуть в тот момент, когда вы его записываете.

Ваш код не вызывает блок, и вы не можете вернуть из него значения в свой код. Нет смысла так делать. Если другая часть вашего кода хочет знать, когда сохранение завершено, вам нужно будет использовать какой-то другой механизм, кроме возвращаемых значений, например, вызов метода из вашего блока, публикация уведомления или наблюдение за значением ключа.

person Jim    schedule 13.03.2013
comment
Я имею в виду метод, который я написал, это метод класса. Я знаю, что saveInBackground не является методом класса, поскольку он говорит, что это простые буквы, то есть метод экземпляра. - person Jon Erickson; 13.03.2013
comment
Ах я вижу. Остальная часть моего ответа остается в силе. Метод класса возвращается до того, как блок будет выполнен. - person Jim; 13.03.2013

Из ключевого слова блока InBackground:

[currentInstallation saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
    if (error == nil) {
        NSLog(@"Parse Save Succeeded");
        [self saveDepartmentsDictionary:dictionary];
    } else {
        NSLog(@"Parse Save Failed, %@", error.localizedDescription);
    }
}];

Я предполагаю, что блок вызывается асинхронно.

Если вы хотите получить результат, вы можете подождать здесь, пока блок не выполнится, но это сделает saveInBackgroundWithBlock бесполезным.

Так что NSNotification может быть лучше:

[currentInstallation saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
    if (error == nil) {
        NSLog(@"Parse Save Succeeded");
        [self saveDepartmentsDictionary:dictionary];
        [[NSNotificationCenter defaultCenter] postNotificationName:kNotificationParseSaveSucceeded object:nil];
    } else {
        NSLog(@"Parse Save Failed, %@", error.localizedDescription);
        [[NSNotificationCenter defaultCenter] postNotificationName:kNotificationParseSaveFailed object:nil];
    }
}];
person Jason Lee    schedule 13.03.2013