cocos2d-iphone 2.0.0 を使用した私の iOS ゲームには、ユーザーがクリックして購入するためのボタン ( ) を使用してアプリ内購入を購入するようユーザーに求めるスプライトをポップアップするレイヤーがありますmenuItemBuyButton
。ユーザーがこの購入ボタンをクリックすると、次の 3 つのことが行われます。
- アクティビティ インジケータが開始されました
- レイヤー上のすべてのメニュー項目が無効になります。特に、メイン メニュー (このコードはメイン メニュー シーンにあります)、購入ボタン自体、およびポップアップのメニューが無効になります。
- 購入の呼び出しとコールバックの通常のシーケンスがトリガーされます。
購入が完了すると、(別のスレッドにある) コールバックは次のことを行う必要があります。
- アクティビティ インジケーターを停止する
- 無効なメニュー要素を再度有効にする
- シーンを別の監督に置き換える
ここで、このシーケンスを実行し、購入ボタンを繰り返しクリックしてテストするなどすると、コードでクラッシュが発生しました。コードとクラッシュ ログは以下のとおりです。これは、cocos2d のスレッドセーフでない性質によるものだと思います (間違っているかもしれません)。このクラッシュを回避するにはどうすればよいですか? 購入トランザクションを開始する前に UI 要素を無効にする必要があり、トランザクションが終了したら再度有効にする必要があります。これは別のスレッドで行われます。
コードは次のとおりです。
-(void) startActivityIndicator {
mainMenu.enabled = NO;
scorePopupMenu.enabled = NO;
menuItemBuyButton.isEnabled = NO;
[activityIndicatorView startAnimating];
}
-(void) stopActivityIndicator {
mainMenu.enabled = YES;
scorePopupMenu.enabled = YES;//this is line 744 that crashed
menuItemBuyButton.isEnabled = YES;
if (activityIndicatorView.isAnimating)
[activityIndicatorView stopAnimating];
}
クラッシュ ログ:
5 SmartRun 0x00126c4c -[MainMenuLayer stopActivityIndicator] (MainMenuLayer.m:744)