實踐動機和目標
目前具有社交功能的App中大量使用本地Sql來存儲用戶記錄,同時為了優化用戶體驗,這些App都愿意提供用戶在無網(或弱網)環境下操作的需求。因此,在App中有必要有異步通信機制來處理(響應)用戶的請求。
實現原理
1.通過在Sqlite中設立事件表(EventTable),來記錄用戶操作信息。
2.借由Lua提供的協程來處理用戶請求,并向服務器發送請求。
3.完成與服務器的一次響應事件后,刪除這一條操作事件。
建立事務表
在Sqlite中建立事務表,建議在表中設立一個時間戳類型的字段(EventDate)。采用時間戳類型的字段主要有兩個目的:
1.作為事件的唯一標識符
2.時間戳類型本身可以作為字段進行排序
由此聯想:Sqlite本身對每一行數據都會設置一個id,能否利用這個字段進行排序?
獲取隊列
隊列的必要特性就是先進先出,那么就要在sql語句中實現。代碼如下:
select * from EventTable order by EventDate ASC limit 1
order by EventDate ASC 按照EventDate對EventTable事件表進行正序排序
limit 1 取頂部第一條數據
設置Lua線程
Lua語言本身提協同程序處理,創建協程代碼:
function ?syncService(...)
? ? ? ?while true do
? ? ? ? ? ? ? -- [[ 處理內容 ]] --
? ? ? ? ? ? ? sleep(1)
? ? ? ?end
end
local syncData = coroutine.create(syncService)
functiononReady(...)
? ? ? ? ?coroutine.resume(syncData)
end
完善處理內容
在處理內容中可以完成API請求,在這個步驟中可以做以下配置:
設定一個全局變量 local sync = true
方法體中依次完成隊列獲取、調取API、刪除隊列(釋放):
local sync = true--全局變量
if sync then
? ? ? local data =? dbHelper.execTable("select*fromEventTableorderbyEventDateASClimit1", "select”)
? ? ? if data and #data >0 then?
? ? ? ? ? ? ?if data[1] and data[1].EventDate then
? ? ? ? ? ? ? ? ? ? sync =false
? ? ? ? ? ? ? ? ? ? local response = post( ) --調取API,這里做了簡略
? ? ? ? ? ? ? ? ? ? if response ==200 then
? ? ? ? ? ? ? ? ? ? ? ? ? ?dbHelper.execTable("delete from EventTable where EventDate = '"..data[1].EventDate.."'","delete") --釋放隊列? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ?sync =true
? ? ? ? ? ? ? ? ? ? else?
? ? ? ? ? ? ? ? ? ? ? ? ? ?sync =true
? ? ? ? ? ? ? ? ? ? end
? ? ? ? ? ? end
? ? ? end
end
以上就是利用Lua來實現消息隊列的基本思想
思考:調取線程中使用while死循環是否可取,有無更好的替代方案?