Определение метода для получения блока обратного вызова
Я прочитал документацию 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);
}