0

ブロックを含む呼び出したクラス メソッドから bool 値を返そうとしています。「互換性のないブロック ポインター タイプが送信されています...」というエラーが表示されます。これを回避するにはどうすればよいですか? 私が呼び出したクラスメソッドがエラーの有無にかかわらず完了するかどうかを知りたいだけです...

+ (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);
        }
    }];
}
4

2 に答える 2

1

ブロックキーワードから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];
    }
}];
于 2013-03-13T02:19:45.597 に答える
1

呼び出すクラスメソッドかどうかを知りたいだけです

これは、非同期コードがどのように機能するかについての誤解です。にブロックを指定する場合saveInBackgroundWithBlock:、そのコードはすぐには実行されません。これは、後のある時点でParseフレームワークによって実行され、Parseのどの部分でも、ブロックに戻り値が定義されている場合は戻り値が返されますが、そうではありません。ブロックは、書き込んだ時点では実行されないため、書き込んだ時点では何も返すことができません。

コードはブロックを呼び出しておらず、ブロックからコードに値を返すことはできません。そうすることは意味がありません。コードの別の部分で保存がいつ終了したかを知りたい場合は、ブロックからのメソッドの呼び出し、通知の投稿、Key-Valueの監視など、戻り値以外のメカニズムを使用する必要があります。

于 2013-03-13T01:59:50.413 に答える