我是Obj-c的新手。我有一个类将一个var boolean设置为YES,如果它成功(Game Center login = success),那将是多么好的事情,是某种方式有一个监听器,当它是YES时侦听它然后执行一些代码。我是否使用了一个块?我也在使用Sparrow框架。
这是我的GameCenter.m文件中的代码
-(void) setup
{
gameCenterAuthenticationComplete = NO;
if (!isGameCenterAPIAvailable()) {
// Game Center is not available.
NSLog(@"Game Center is not available.");
} else {
NSLog(@"Game Center is available.");
__weak typeof(self) weakSelf = self; // removes retain cycle error
GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer]; // localPlayer is the public GKLocalPlayer
__weak GKLocalPlayer *weakPlayer = localPlayer; // removes retain cycle error
weakPlayer.authenticateHandler = ^(UIViewController *viewController, NSError *error)
{
if (viewController != nil)
{
[weakSelf showAuthenticationDialogWhenReasonable:viewController];
}
else if (weakPlayer.isAuthenticated)
{
[weakSelf authenticatedPlayer:weakPlayer];
}
else
{
[weakSelf disableGameCenter];
}
};
}
}
-(void)showAuthenticationDialogWhenReasonable:(UIViewController *)controller
{
[[[[[UIApplication sharedApplication] delegate] window] rootViewController] presentViewController:controller animated:YES completion:nil];
}
-(void)authenticatedPlayer:(GKLocalPlayer *)player
{
NSLog(@"%@,%@,%@",player.playerID,player.displayName, player.alias);
gameCenterAuthenticationComplete = YES;
}
-(void)disableGameCenter
{
}
但我需要从另一个对象知道gameCenterAuthenticationComplete是否等于YES。
答案 0 :(得分:3)
您可以使用委托模式。它比KVO或本地通知更容易使用,并且在Obj-C中使用了很多。
通知只应在特定情况下使用(例如,当您不知道谁想听,或者有多于一个听众时)。
一个块可以在这里工作,但代表完全一样。
答案 1 :(得分:2)
您可以使用KVO(键值观察)来观察对象的属性,但我宁愿在您的情况下发布NSNotification。
您需要让对象感兴趣知道Game Center登录何时发生在NSNotificationCenter
注册,然后将NSNotification
发布到您的Game Center处理程序中。阅读通知编程主题了解更多详情!
答案 2 :(得分:0)
如果在单个委托对象上执行单个方法,则只需在setter中调用它即可。让我给这个属性命名:
@property(nonatomic,assign, getter=isLogged) BOOL logged;
实现setter就足够了:
- (void) setLogged: (BOOL) logged
{
_logged=logged;
if(logged)
[_delegate someMethod];
}
另一种(建议的)方法是使用NSNotificationCenter。使用NSNotificationCenter,您可以通知多个对象。当属性更改为YES时,想要执行方法的所有对象都必须注册:
NSNotificationCenter* center=[NSNotificationCenter defaultCenter];
[center addObserver: self selector: @selector(handleEvent:) name: @"Logged" object: nil];
每次记录更改为YES时,都会执行handleEvent:选择器。因此,只要房产发生变化,就发布通知:
- (void) setLogged: (BOOL) logged
{
_logged=logged;
if(logged)
{
NSNotificationCenter* center=[NSNotificationCenter defaultCenter];
[center postNotificationName: @"Logged" object: self];
}
}