1

我是 Obj-c 的新手。我有一个类,如果成功(游戏中心登录 = 成功),则将 var boolean 设置为 YES,这样做会很棒,以某种方式有一个侦听该 var 的侦听器,当它是 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。

4

3 回答 3

3

您可以使用委托模式。它比 KVO 或本地通知更容易使用,并且在 Obj-C 中被大量使用。

通知应仅在特定情况下使用(例如,当您不知道谁想收听或当有超过 1 个听众时)。

一个块在这里可以工作,但委托人做的完全一样。

于 2013-03-26T21:05:52.110 回答
2

您可以使用 KVO(键值观察)来观察对象的属性,但我宁愿在您的情况下发布 NSNotification。

您需要让有兴趣了解 Game Center 登录时间的对象注册到NSNotificationCenter,然后将其发布到NSNotification您的 Game Center 处理程序中。阅读通知编程主题了解更多详情!

于 2013-03-26T21:04:36.960 回答
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];
   }
}
于 2013-03-26T21:04:51.170 回答