飛地有用戶寫作的需求,所以積累了寫作和數(shù)據(jù)同步的技術(shù)研究珊楼,這是第二篇數(shù)據(jù)同步通殃,第一篇寫作點(diǎn)此進(jìn)入。
因?yàn)楫a(chǎn)品有草稿箱功能亥曹,所以需要多端同步數(shù)據(jù)邓了。而同步的對(duì)象是文章,且不做沖突備份媳瞪,直接以最新的版本為主,所以對(duì)于同步流程減少一定的復(fù)雜度照宝。
文章本地?cái)?shù)據(jù)模型
同步就是拿本地的緩存數(shù)據(jù)與服務(wù)器數(shù)據(jù)做對(duì)比與合并的過(guò)程蛇受,那么飛地本地的數(shù)據(jù)模型大概是這樣
class Article {
var uuid: String = UUID().uuidString //文章uuid
var time: TimeInterval = Date().timeIntervalSince1970 //文章修改時(shí)間戳
var isLocal: Bool = false //是否為本地文章,未保存到服務(wù)器草稿箱
var cover: URL? //文章封面圖
var title: String? //文章標(biāo)題
var content: String? //文章內(nèi)容html
}
-
文章uuid
并非后臺(tái)生成的數(shù)據(jù)庫(kù)自增長(zhǎng)id厕鹃,而是由
用戶端
新建寫作時(shí)生成的36位長(zhǎng)度uuid字符串兢仰,用于資源上傳時(shí)與文章關(guān)聯(lián),后續(xù)文章被刪除時(shí)好清理無(wú)引用的資源剂碴,如圖片把将。 文章修改時(shí)間戳
相當(dāng)于文章版本號(hào),上面說(shuō)到文章同步不做沖突備份忆矛,直接以最新的版本為主
就是根據(jù)時(shí)間戳來(lái)對(duì)比察蹲。isLocal
標(biāo)識(shí)是否為本地文章请垛,在準(zhǔn)備同步對(duì)比數(shù)據(jù)
與保存本地文章
時(shí)都會(huì)用到。其它三個(gè)可選字段都為文章數(shù)據(jù)字段洽议,在后面操作中都是直接覆蓋值的宗收,并不做內(nèi)容的沖突。
流程
準(zhǔn)備同步對(duì)比的數(shù)據(jù)
可以理解為本地已保存的文章
的簡(jiǎn)要數(shù)據(jù)【文章uuid亚兄、文章修改的時(shí)間戳】混稽,所謂已保存的文章
就是本地文章isLocal=true
的數(shù)據(jù)
//請(qǐng)求sync接口的簡(jiǎn)要數(shù)據(jù)例子
datas: [{
uuid: 'xxx', //文章uuid
time: xxx //文章最新修改的時(shí)間戳
}]
刪除草稿時(shí)需要有網(wǎng)絡(luò)下才能操作,也就是說(shuō)刪除操作不在同步中處理审胚。
本地新增的文章也不需要傳到后臺(tái)去對(duì)比匈勋。
同步對(duì)比
以上的數(shù)據(jù)請(qǐng)求sync同步接口,后臺(tái)接收到數(shù)據(jù)后和數(shù)據(jù)庫(kù)進(jìn)行對(duì)比返回變動(dòng)數(shù)據(jù):
{
deletes: [ uuid ], //服務(wù)器根據(jù)參數(shù)中的uuid查找數(shù)據(jù)庫(kù)(草稿箱和文章表)中該文章是否已刪除膳叨,如果是則放在此key下颓影。
conflicts:[ {object} ], //沖突的數(shù)據(jù),根據(jù)參數(shù)中的uuid與時(shí)間戳做對(duì)比懒鉴,如果數(shù)據(jù)庫(kù)的時(shí)間戳大于傳過(guò)來(lái)的時(shí)間戳則代表文章有新的保存诡挂,需要把該文章新對(duì)象 放在該key下
saves:[ uuid ], //同上,如果數(shù)據(jù)庫(kù)的時(shí)間戳小于傳過(guò)來(lái)的時(shí)間戳則代表該用戶端有新的改動(dòng)临谱,需要把 該文章uuid 放在該key下
adds:[ {object} ] //返回?cái)?shù)據(jù)庫(kù)中新增的文章對(duì)象
}
本地合并
APP收到以上對(duì)比數(shù)據(jù)后璃俗,分別對(duì)每個(gè)key進(jìn)行處理
- deletes中的文章會(huì)從本地刪除
- conflicts中的數(shù)據(jù)會(huì)替換本地的數(shù)據(jù)
- saves是本地新改動(dòng)的數(shù)據(jù),該key下的數(shù)據(jù)需要進(jìn)行第5步操作
- adds中的數(shù)據(jù)會(huì)新增到本地
保存本地文章
本地新增的文章在以上流程中都沒(méi)有傳到服務(wù)器上保存悉默,所以最后我們把本地文章isLocal=true
全保存到服務(wù)器上城豁。
至此,一次同步流程結(jié)束抄课。