0

Parse.com を使用して、iOS アプリのデータを保存しています。以下のコードは、PFObject「ゲーム」に属するネストされた配列内のすべての値を正常に取得します。ただし、別の配列を照会する必要がある場合 (「勝者」(「敗者」など) と同じレベルで)、それを機能させることができず、配列敗者のすべての値が入力されるわけではありません。私はそれらを行うことができると思いますすべてメインスレッド上でフェッチ(ネストされたブロック)をネストしようとしませんが、次のことを疑問に思っています:

1) データの保存方法が原因で、Parse に組み込まれているクエリ/フェッチ機能を適切に使用できませんか? データは次のように保存されます:

PFObject * newGame = [PFObject objectWithClassName:@"Game"];
NSArray * winner = [NSArray arrayWithObjects:[_allPlayersPFDictionary objectForKey:[playerData objectAtIndex:0]], [playerData objectAtIndex:1], nil];
[_gamePF addObject:winner forKey:@"winners"];

2)クエリを実行し、クエリ内のすべてのネストされたデータ配列のすべての値を取得するためのより良い、よりクリーンな方法はありますか? 繰り返しますが、winners は PFObject ではありませんが、2 つの異なる型の PFObject の配列の配列です (配列[PFObject fetchAll:(NSArray *)winnersArray]内のすべてのオブジェクトが PFObject の同じ「型」でなければならないため、機能しません)。各勝者には別の PFObject (1 から多数) の「パワー」が関連付けられているため、この方法で保存します。

これは機能するクエリですが、「敗者」を追加してバックグラウンドですべてのデータを適切に入力する方法がわかりません。

PFQuery * gamesQuery = [PFQuery queryWithClassName:@"Game"];
[gamesQuery orderByDescending:@"createdAt"];
gamesQuery.limit = 30;
[gamesQuery findObjectsInBackgroundWithBlock:^(NSArray * theGames, NSError * error) {
    if (error) {
        NSLog(@"ERROR: There was an error with the Query to get Games!");
    } else {
        for (PFObject * aGame in theGames) {
            for (NSArray * aWinner in [aGame objectForKey:@"winners"]) {
                [[aWinner objectAtIndex:0] fetchIfNeededInBackgroundWithBlock:^(PFObject *object, NSError *error) {
                    if (error) {
                        NSLog(@"ERROR: There was an error with the Query to get Player in winnersArray!");
                    } else {
                        [PFObject fetchAllIfNeededInBackground:[aWinner objectAtIndex:1] block:^(NSArray *objects, NSError *error) {
                            if (error) {
                                NSLog(@"ERROR: There was an error with the Query to get Powers in winnersArray!");
                            } else {
                             [_gamesPF addObject:aGame];
                                NSLog(@"Games from viewDidLoad %@", _gamesPF);
                                [_tableView reloadData];
                            }
                        }];
                    }
                }];
            }
        }
    }
}];
4

1 に答える 1

3

うーん...ちょっとばかげている気がします。データモデルに対してオブジェクト指向の方法でParseを使用する方がはるかに簡単です。データを次のように改造することで、簡単に解決できました。

ゲーム (PFObject *) には次のものがあります。

--> winners { (PFObject *), (PFObject *), ..., nil }
--> losers  { (PFObject *), (PFObject *), ..., nil }

勝者は次のように作成されます。

[testWinner1 addObject:power1 forKey:@"power"];
[testWinner1 addObject:power2 forKey:@"power"];
[testWinner1 addObject:[_playerPFDictionary objectForKey:@"Tom"] forKey:@"player"];

これにより、クエリがはるかに簡単になり、次のようなバックグラウンド ブロックが 1 つだけ含まれます。

PFQuery * gameQuery = [PFQuery queryWithClassName:@"TestGame"];
[gameQuery includeKey:@"winners.player"];
[gameQuery includeKey:@"winners.power"];
[gameQuery includeKey:@"losers.player"];
[gameQuery includeKey:@"losers.power"];
[gameQuery findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
    if (error) {
        NSLog(@"failed");
    } else {
        NSLog(@"testGame: %@", [objects objectAtIndex:0]);
    }
}];
于 2013-01-25T03:00:08.580 に答える