48 lines
1.7 KiB
Lua
48 lines
1.7 KiB
Lua
local function CreateCacheData(data, version, getRefreshIntervalFunc, refreshFunc)
|
|
local this = {}
|
|
this.Data = data
|
|
this.Version = version
|
|
this.GetRefreshIntervalFunc = getRefreshIntervalFunc
|
|
this.RefreshFunc = refreshFunc
|
|
local refreshDebounce = false
|
|
|
|
--Use new data to update, usually we do this at intervals in BG
|
|
function this:Update(newCached)
|
|
if newCached and newCached.Version then
|
|
if self.Version <= newCached.Version then
|
|
self.Version = newCached.Version
|
|
self.Data = newCached.Data
|
|
end
|
|
end
|
|
end
|
|
|
|
--Refresh the data, usually we will call the Refresh when some data is required
|
|
function this:Refresh(forceRefresh)
|
|
if self.RefreshFunc and type(self.RefreshFunc) == 'function' then
|
|
while refreshDebounce do
|
|
wait()
|
|
end
|
|
|
|
--Get RefreshInterval
|
|
local RefreshInterval = nil
|
|
if self.GetRefreshIntervalFunc and type(self.GetRefreshIntervalFunc) == 'function' then
|
|
RefreshInterval = tonumber(self.GetRefreshIntervalFunc())
|
|
end
|
|
|
|
if forceRefresh or not self.Version or not RefreshInterval or (tick() - self.Version >= RefreshInterval) then
|
|
refreshDebounce = true
|
|
--RefreshFunc will update data, and return whether the refresh was valid
|
|
if self.RefreshFunc(self.Data) then
|
|
self.Version = tick()
|
|
else --this refresh fails, we needs to reset Version to ensure next RefreshFunc call
|
|
self.Version = nil
|
|
end
|
|
refreshDebounce = false
|
|
end
|
|
end
|
|
end
|
|
return this
|
|
end
|
|
|
|
|
|
return CreateCacheData |