在Objective C中使用Block来确定是否已设置BOOL?

时间:2013-03-26 21:00:40

标签: objective-c objective-c-blocks

我是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。

3 个答案:

答案 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];
   }
}