下载 App
发布时间
发布时间
coco
明白了,参考那个项目的经验。核心问题是事件订阅时序和持久化链路完整性。让我逐步修复。
06-28 18:11
第一步:在 HandleUpdate 中添加定时自动保存:
06-28 18:12
5 个执行节点
已经有 Store.UpdateSync(dt) 调用了!让我检查这个函数是否存在及其实现:
06-28 18:12
5 个执行节点
自动保存机制已经存在!QUICK_SYNC_DELAY = 2.0 秒,修改后 2 秒自动同步。所以持久化应该没问题(你也确认了刷新数据还在)。
那问题聚焦在便签墙。让我看 SyncToCloud 和便签相关的写入链路:
06-28 18:13
7 个执行节点
SyncToCloud() 已经包含 _appendWallEntries,所以 wall_profit (iscore) 每次同步都会写入。链路看起来是完整的。
那便签不显示的问题在WallServer 共享墙的加载和传输链路。让我检查:
06-28 18:14
4 个执行节点
找到便签墙不显示的根因了!
lua
复制
function HandleWallClientReady(eventType, eventData)
    ...
    if not isLoaded then
        print("[WallServer] Data not loaded yet, delaying sync...")
        return  -- ❌ 直接 return,没有重试!
    end
    WallServer.SendSyncAll(connection)
end
时序竞争:
服务器启动 → LoadFromCloud() 开始(异步)
客户端快速连接 → 发送 WALL_CLIENT_READY
服务器收到 → isLoaded 还是 false → 直接 return,不再重试
LoadFromCloud 完成 → isLoaded = true
但没有人再给已连接的客户端发送 SYNC_ALL!
结果:便签墙永远为空。
06-28 18:15
修复:记住等待中的连接,LoadFromCloud 完成后补发 SYNC_ALL:
06-28 18:15
现在修改 LoadFromCloud 完成后补发 SYNC_ALL:
06-28 18:15
现在修改 HandleWallClientReady,把等待中的客户端暂存:
06-28 18:15
现在构建测试:
06-28 18:16
构建成功。修复总结:
根因:HandleWallClientReady 在 isLoaded=false 时直接 return,没有重试机制 → 客户端永远收不到便签数据。
修复:
lua
复制
-- 修复前:
if not isLoaded then return end  -- ❌ 丢弃,永不重试
-- 修复后:
if not isLoaded then
    table.insert(pendingClients, connection)  -- ✅ 暂存
    return
end
-- LoadFromCloud 完成后自动补发:
for _, conn in ipairs(pendingClients) do
    WallServer.SendSyncAll(conn)
end
这和你分享的那个项目经验一样——事件时序竞争:异步操作(LoadFromCloud)未完成时,如果已有请求到达,必须暂存而非丢弃。
请刷新 PC 预览测试,登录页应该能看到便签了。