設計簡易的 Dispatcherless 自動配對機制 - 透過 Firebase Realtime Database
排隊結構
FIRDatabaseReference* pair_ref = [[[FIRDatabase database] reference] child:@"Queue/GroupA"];
[pair_ref runTransactionBlock:^FIRTransactionResult* _Nonnull(FIRMutableData* _Nonnull currentData) {
NSMutableArray* datas = currentData.value;
if (!datas || [datas isEqual:[NSNull null]]) {
// Queue 空白,將自己排入 Queue
NSDictionary* data = @{
@"game_id" : "UUID GAME ID", // 新建遊戲房的 ID
@"score" : 100, // 玩家目前積分
@"low" : 80, // 配對玩家的積分下限
@"high" : 120, // 配對玩家的積分上限
};
datas = [[NSMutableArray alloc] initWithObjects:data, nil];
} else {
BOOL pair = NO;
for (NSDictionary* data in datas) {
if ([[data objectForKey:@"score"] intValue] >= 80
&& [[data objectForKey:@"score"] intValue] <= 120
&& 100 >= [[data objectForKey:@"low"] intValue]
&& 100 <= [[data objectForKey:@"high"] intValue]) {
// 配對成功 Pair,將等待訊息移除,目標前往加入 [data objectForKey:@"game_id"]
[datas removeObject:data];
break;
}
}
if (!pair) {
// 配對失敗,將自己排入 Queue
NSDictionary* data = @{
@"game_id" : "UUID GAME ID",
@"score" : 100,
@"low" : 80,
@"high" : 120,
};
[datas addObject:data];
}
}
[currentData setValue:datas];
return [FIRTransactionResult successWithValue:currentData];
}
andCompletionBlock:^(NSError* _Nullable error, BOOL committed, FIRDataSnapshot* _Nullable snapshot) {
if (error || !committed) {
// 配對失敗
} else {
// 成功配對,進入下個階段,前往 game
}
}
withLocalEvents:NO];遊戲結構
Last updated