2013-07-03 2 views
0

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

С контроллера точки зрения я вызываю метод в игровой модели, и как только игра будет создана, мне нужно сделать обратный вызов моему контроллеру просмотра, чтобы сказать, что он был успешным, и новый 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"); 
} 

View Controller вызов

[MESGameModel createNewGameAgainst:self.gameNewOpponentuser]; 

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

+0

Я также проверил этот вопрос перед рукой и не смог определить ответ на мой вопрос. спасибо – StuartM

+0

Просьба уточнить, что вы пробовали и что _exactly_ вы не понимаете, тогда. –

ответ

3

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

Заголовок:

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

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

+0

Спасибо, это замечательно, однако я получаю предупреждение о методе - конфликтующие типы параметров __strong id 'vs' void (^ _ strong) (BOOL) '? – StuartM

+0

Как следует назвать метод в интерфейсе? + (void) createNewGameAgainst: (PFUser *) user2 withCompletion: completeHandler; ?? – StuartM

+1

Я добавил для вас объявление заголовка файла. Вам также может быть повезло посмотреть здесь: [Working WIth Blocks] (http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/ProgrammingWithObjectiveC/WorkingwithBlocks/WorkingwithBlocks.html) Это дает приятное обзор блоков, и вы можете специально посмотреть на формат, который вы ищете, в разделе «Блок должен всегда быть последним аргументом метода». – TheRobDay

0

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

+(void)createNewGameAgainst:(PFUser *)user2 callback:(void (^)(NSError *error))callback { 
    // do something 
    NSError *error = nil; // set to something useful if an error occurs 
    callback(error); 
} 
Смежные вопросы