refactor(game): 重构云端数据同步逻辑并提取公共方法
- 将 `getCloudData` 中的冲突解决逻辑提取为独立的 `syncWithCloudData` 方法 - 修改 `getCloudData` 返回 Promise 以支持调用方等待 - 在 `Initialize` 中统一使用 `gameDataSync.syncWithCloudData` 处理数据合并 - 移除 `Initialize` 中重复的 `isWxClient` 方法,复用 `GameDataSync` 中的实现 - 简化 `loadFromCloud` 方法,将登录后数据处理委托给 `syncWithCloudData`
This commit is contained in:
@@ -93,49 +93,60 @@ export class GameDataSync {
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 将获取到的云端数据与本地对比并合并
|
||||
*/
|
||||
public syncWithCloudData(cloudData: CloudData | null) {
|
||||
const localData = this.loadFromLocal();
|
||||
|
||||
let cloudTs = cloudData?.data?.timestamp || 0;
|
||||
let localTs = localData?.timestamp || 0;
|
||||
|
||||
if (!localData || cloudTs > localTs) {
|
||||
mLogger.log(this.debugMode, 'GameDataSync', `[GameDataSync]: 云端数据较新 (Cloud: ${cloudTs} > Local: ${localTs}), 执行覆盖。`);
|
||||
if (cloudData) {
|
||||
smc.overrideLocalDataWithRemote(cloudData);
|
||||
this.saveToLocal(); // 同步到本地
|
||||
}
|
||||
} else {
|
||||
mLogger.log(this.debugMode, 'GameDataSync', `[GameDataSync]: 本地数据较新 (Local: ${localTs} >= Cloud: ${cloudTs}), 使用本地数据,触发强制云同步。`);
|
||||
smc.overrideLocalDataWithRemote({ data: localData });
|
||||
// 本地数据较新,需要强制推送到云端以保证多端一致
|
||||
this._localDataDirty = true;
|
||||
this.executeCloudSync();
|
||||
}
|
||||
}
|
||||
|
||||
public getCloudData() {
|
||||
const localData = this.loadFromLocal();
|
||||
|
||||
// 未登录微信云端前,先用本地数据顶上(让玩家秒进游戏)
|
||||
if (localData && !this.isWxClient()) {
|
||||
smc.overrideLocalDataWithRemote({ data: localData });
|
||||
return;
|
||||
return Promise.resolve(false);
|
||||
}
|
||||
|
||||
WxCloudApi.get().then(async (result) => {
|
||||
return WxCloudApi.get().then(async (result) => {
|
||||
if(result.result.code === 200) {
|
||||
let cloudData = result.result.data as CloudData;
|
||||
mLogger.log(this.debugMode, 'GameDataSync', `[GameDataSync]: 获取游戏云端数据成功:`, cloudData);
|
||||
|
||||
// 冲突解决:基于时间戳比较(云端时间戳 > 本地时间戳 则覆盖)
|
||||
let cloudTs = cloudData?.data?.timestamp || 0;
|
||||
let localTs = localData?.timestamp || 0;
|
||||
this.syncWithCloudData(cloudData);
|
||||
|
||||
if (!localData || cloudTs > localTs) {
|
||||
mLogger.log(this.debugMode, 'GameDataSync', `[GameDataSync]: 云端数据更新 (Cloud: ${cloudTs} > Local: ${localTs}), 执行覆盖。`);
|
||||
smc.overrideLocalDataWithRemote(cloudData);
|
||||
this.saveToLocal(); // 同步到本地
|
||||
} else {
|
||||
mLogger.log(this.debugMode, 'GameDataSync', `[GameDataSync]: 本地数据更新 (Local: ${localTs} >= Cloud: ${cloudTs}), 使用本地数据,触发强制云同步。`);
|
||||
smc.overrideLocalDataWithRemote({ data: localData });
|
||||
// 本地数据较新,需要强制推送到云端以保证多端一致
|
||||
this._localDataDirty = true;
|
||||
this.executeCloudSync();
|
||||
}
|
||||
|
||||
return true
|
||||
return true;
|
||||
} else {
|
||||
mLogger.warn(this.debugMode, 'GameDataSync', `[GameDataSync]: 获取游戏云端数据失败,使用本地缓存兜底。`);
|
||||
if (localData) {
|
||||
smc.overrideLocalDataWithRemote({ data: localData });
|
||||
}
|
||||
return false
|
||||
return false;
|
||||
}
|
||||
}).catch((error) => {
|
||||
mLogger.error(this.debugMode, 'GameDataSync', `[GameDataSync]: 获取游戏云端数据异常:`, error);
|
||||
if (localData) {
|
||||
smc.overrideLocalDataWithRemote({ data: localData });
|
||||
}
|
||||
return false;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user