Reputation: 1301
I want to handle the error case where endTurnWithNextParticipants
fails. I therefore store match data by calling the cacheFailedEndTurnWithNextParticipants
method at the end of this post. I provided the function only for reference.
The problem is that I don't know how I shall restore the data in the uncache method. How can I load the GKTurnBasedPlayers
for the nextParticipants list? I use GKPlayer::loadPlayersForIdentifiers
now, but I get the following warning:
"/Users/eternity/Documents/Xcode/DominationSK/DominationSK/GKMatchCache.m:134:74: Incompatible pointer types sending 'NSArray<GKPlayer *> * _Nullable' to parameter of type 'NSArray<GKTurnBasedParticipant *> * _Nonnull'"
How can I load GKTurnBasedParticipants
from ID's?
Shall this retransmitting be done in another way?
-(void)uncache
{
if (_cache.count > 0)
{
NSDictionary *d = _cache[0];
[_cache removeObjectAtIndex:0];
[GKTurnBasedMatch loadMatchWithID:d[MATCH_ID]
withCompletionHandler:^(GKTurnBasedMatch * _Nullable match, NSError * _Nullable error) {
if (error == nil)
{
bad load method --> [GKPlayer loadPlayersForIdentifiers:d[PARTICIPANTS]
withCompletionHandler:^(NSArray<GKPlayer *> * _Nullable nextParticipants, NSError * _Nullable error) {
if (error == nil)
{
NSNumber *timeout = d[TIMEOUT];
warning --> [match endTurnWithNextParticipants:nextParticipants
turnTimeout:timeout.longValue
matchData:d[DATA]
completionHandler:^(NSError * _Nullable error){
// This is not finished
}];
}
else
{
[self addToCache:d]; // TODO: Add time to live
}
}];
}
else
{
[self addToCache:d]; // TODO: Add time to live
}
}];
}
}
// Just for reference
-(void)cacheFailedEndTurnWithNextParticipants:(GKTurnBasedMatch*)match
participants:(NSArray<GKTurnBasedParticipant*>* _Nonnull)nextParticipants
turnTimeout:(NSTimeInterval)timeout
matchData:(NSData* _Nonnull)matchData
error:(NSError* _Nonnull)error
{
if ([self shallBeCached:error])
{
NSMutableArray *playerIds = [[NSMutableArray alloc] init];
for (GKTurnBasedParticipant *p in nextParticipants)
{
[playerIds addObject:p.player.playerID];
}
NSDictionary *d = @{MATCH_ID : match.matchID,
PARTICIPANTS : playerIds,
TIMEOUT : [NSNumber numberWithLong:timeout],
DATA : matchData};
[self addToCache:d];
}
}
Upvotes: 1
Views: 39
Reputation: 1301
It's possible to get the participants from the match, and then retrieve player IDs from that array, and finally update the participants attribute in the match.
Upvotes: 0