0

テーブルビューを作成するために、プレイヤーが参加しているターンベースのゲームをプルしようとしています。

これは彼らのゲームを引っ張る私の機能です:

- (void) loadMatchDataWithArray:(NSMutableArray*)currentGames Flag:(bool*)returned
{
    NSMutableArray* __block blockGames = currentGames;
    bool* __block blockReturn = returned;

    [GKTurnBasedMatch loadMatchesWithCompletionHandler:^(NSArray *matches, NSError *error)
     {
         if (matches)
         {
             for (int i = 0; i < matches.count; i++)
             {
                 [(GKTurnBasedMatch*)matches[i] loadMatchDataWithCompletionHandler: ^(NSData *matchData, NSError *error)
                  {
                      int size = [matchData length];
                      if (size != 0)
                      {
                          Game* game = [NSKeyedUnarchiver unarchiveObjectWithData:matchData];
                          [blockGames addObject:game];
                      }
                      else
                      {
                          Game* game = [[Game alloc] init];
                          [blockGames addObject:game];
                          game.activePlayer = [GKLocalPlayer localPlayer];
                      }
                      *blockReturn = true;
                  }];
             }
         }
         else
         {
             *blockReturn = true;
         }
     }];
}

そして、これは私がそれを呼ぶところです:

- (void)viewDidLoad
{
    [super viewDidLoad];
    [[self tableView]
    setBackgroundView:[[UIImageView alloc]
    initWithImage:[UIImage imageNamed:@"iPhoneBackground-568h"]]];

    bool* returned = false;
    [[GKMatchHelper sharedInstance] loadMatchDataWithArray:currentGames Flag:returned];
    while (!returned);
    [self.tableView reloadData];

    // Uncomment the following line to preserve selection between presentations.
    // self.clearsSelectionOnViewWillAppear = NO;

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem;
}

悲しいことに、これは空白の黒い画面を表示するだけで、二度と戻りません. ブロックが戻ってきたことを検出し、それまでローディング スピナーを表示し、その時点でテーブルをリロードする方法はありますか?

編集: コードを修正し、MainMenuViewController 内に関数を導入しました。現在はビルドされますが、データは表示されません。

- (void) loadMatchData
{
    NSMutableArray* __block blockGames = currentGames;
    MainMenuViewController* __weakSelf = self;

    [GKTurnBasedMatch loadMatchesWithCompletionHandler:^(NSArray *matches, NSError *error)
     {
         if (matches)
         {
             for (int i = 0; i < matches.count; i++)
             {
                 [(GKTurnBasedMatch*)matches[i] loadMatchDataWithCompletionHandler: ^(NSData *matchData, NSError *error)
                  {
                      int size = [matchData length];
                      if (size != 0)
                      {
                          Game* game = [NSKeyedUnarchiver unarchiveObjectWithData:matchData];
                          [blockGames addObject:game];
                      }
                      else
                      {
                          Game* game = [[Game alloc] init];
                          [blockGames addObject:game];
                          game.activePlayer = [GKLocalPlayer localPlayer];
                      }
                      [__weakSelf.tableView reloadData];
                  }];
             }
         }
         [__weakSelf.tableView reloadData];
     }];
    [__weakSelf.tableView reloadData];
}

そして今、私のViewDidLoadで私はただ呼び出します:

[self loadMatchData];
4

1 に答える 1

0

まあ。「while」ループでプログラムの実行を停止しないでください。[self.tableView reloadData]ブロックの最後に単純に呼び出してみませんか?

そう、

  1. viewDidLoadメソッドの最後の 2 行を削除します
  2. *blockReturn = true;と置き換え[self.tableView reloadData]ます (保持サイクルを避けるために、「自己」への弱い参照を保持する必要がある場合があります)
  3. while (this and that)操作が完了するのを待つために使用しないでください。レスポンシブでない UI は好ましくなく、ユーザーがアプリを放棄する原因になります。
于 2013-04-30T09:05:31.767 に答える