1

私はObj-cを初めて使用します。成功した場合(Game Centerのログイン=成功)にvarブール値を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で多く使用されています。

通知は、特定の状況でのみ使用する必要があります(たとえば、誰が聞きたいかわからない場合、または複数のリスナーがいる場合)。

ここではブロックが機能しますが、デリゲートはまったく同じように機能します。

于 2013-03-26T21:05:52.110 に答える
2

KVO(Key-Value Observing)を使用してオブジェクトのプロパティを監視することもできますが、その場合はNSNotificationを投稿したいと思います。

Game Centerのログインがいつ発生したかを知りたいオブジェクトを登録してから、 GameCenterハンドラーにNSNotificationCenter投稿する必要があります。NSNotification詳細については、通知プログラミングのトピックをお読みください。

于 2013-03-26T21:04:36.960 に答える
0

単一のデリゲートオブジェクトに対して実行する単一のメソッドがある場合は、セッターで呼び出すだけです。このプロパティに名前を付けましょう:

@property(nonatomic,assign, getter=isLogged) BOOL logged;

セッターを実装するだけで十分です。

- (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];

handleEvent:セレクターは、ログに記録された変更がYESになるたびに実行されます。したがって、プロパティが変更されるたびに通知を投稿してください。

- (void) setLogged: (BOOL) logged
{
    _logged=logged;
   if(logged)
   {
        NSNotificationCenter* center=[NSNotificationCenter defaultCenter];
        [center postNotificationName: @"Logged" object: self];
   }
}
于 2013-03-26T21:04:51.170 に答える