Определение метода для получения блока обратного вызова

Я прочитал документацию Apple по блокам, но я не совсем уверен, как использовать их в моей ситуации. В моем приложении есть игровая модель. У этого есть метод, который создает игру двух пользователей.

Из контроллера представления я вызываю метод в игровой модели, и как только игра создана, мне нужно сделать обратный вызов моему контроллеру представления, чтобы сказать, что он был успешным, и новый VC может быть выдвинут.

Текущий код

Модель игры

+(void)createNewGameAgainst:(PFUser *)user2 {
    NSLog(@"createNewGameAgainst");
    // First we put a HUD up for the user on the window
    MBProgressHUD *HUD = [[MBProgressHUD alloc] initWithWindow:[UIApplication sharedApplication].keyWindow];
    [[UIApplication sharedApplication].keyWindow addSubview:HUD];
    HUD.labelText = NSLocalizedString(@"HUDCreateNewGame", @"HUD - Create New Game text");
    HUD.removeFromSuperViewOnHide = YES;

    [HUD showAnimated:YES whileExecutingBlock:^{
        // Do something

        PFObject *newGame = [PFObject objectWithClassName:@"Game"];
        [newGame setObject:[PFUser currentUser] forKey:kMESGameUser1];
        [newGame setObject:user2 forKey:kMESGameUser2];
        [newGame saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
            if (succeeded) {
                NSLog(@"succeeded game creation");
            }
        }];

    }];

    NSLog(@"end of createNewGameAgainst");
}

Просмотр вызова контроллера

[MESGameModel createNewGameAgainst:self.gameNewOpponentuser];

Мне нужно знать, как обновить мой метод выше, чтобы иметь блок обратного вызова. Затем обновите вызов контроллера представления для метода, чтобы он мог выполнить / выдвинуть новый контроллер представления, если создание было успешным.

2 ответа

Решение

Вы можете сделать что-то вроде этого:

Заголовок:

+(void)createNewGameAgainst:(PFUser *)user2 withCompletion:(void (^)(BOOL success))completionHandler;

Реализация:

+(void)createNewGameAgainst:(PFUser *)user2 withCompletion:(void (^)(BOOL success))completionHandler{
NSLog(@"createNewGameAgainst");
// First we put a HUD up for the user on the window
MBProgressHUD *HUD = [[MBProgressHUD alloc] initWithWindow:[UIApplication sharedApplication].keyWindow];
[[UIApplication sharedApplication].keyWindow addSubview:HUD];
HUD.labelText = NSLocalizedString(@"HUDCreateNewGame", @"HUD - Create New Game text");
HUD.removeFromSuperViewOnHide = YES;

[HUD showAnimated:YES whileExecutingBlock:^{
    // Do something

    PFObject *newGame = [PFObject objectWithClassName:@"Game"];
    [newGame setObject:[PFUser currentUser] forKey:kMESGameUser1];
    [newGame setObject:user2 forKey:kMESGameUser2];
    [newGame saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
        if (succeeded) {
            NSLog(@"succeeded game creation");
        }
        completionHandler(succeeded);
    }];

}];

NSLog(@"end of createNewGameAgainst");
}

Получив обновление статуса, вы вызываете обработчик завершения со статусом.

[MESGameModel createNewGameAgainst:self.gameNewOpponentuser withCompletion:^(BOOL success) {
if(success)
    //Do something wonderful
else
    //Ohs nos!
}];

Когда вызывается ваш обработчик завершения, вы можете проверить, было ли действие выполнено успешно.

Я не совсем уверен, если я полностью понимаю ваш вопрос, но, возможно, что-то подобное сработает:

+(void)createNewGameAgainst:(PFUser *)user2 callback:(void (^)(NSError *error))callback {
    // do something
    NSError *error = nil; // set to something useful if an error occurs
    callback(error);
}
Другие вопросы по тегам