数据获取方式
智能云相册按时间维度来管理数据,支持以类似Java中的迭代子模式来分批返回数据。
客户端在获取数据(比如获取照片、相簿、人脸、时光和标签列表等)时,需要提供以下几个参数:
- Cursor:游标,其中包含有时间戳信息。初次获取数据,可以使用0来表示最小游标;使用当前时间戳(精确到毫秒)来表示最大的游标。
- Direction: 获取数据的方向,可选值为forward,backward。当取值为forward时,获取比游标中的时间戳较新的数据。当取值为backward时获取比游标中的时间戳较老的数据
- Size:表示本次请求最多返回多少条记录
智能云相册除返回业务数据以外,还会返回NextCursor。它的取值为:
- 如果有数据返回,NextCursor为下次获取数据的基准游标,客户端可以使用这个游标继续获取数据。
- 如果没有数据返回,NextCursor为EOF。
举例说明:
- 用户在t0时刻开始上传第1-5这5张照片,t1时刻完成上传,
- 在t2时刻上传了6-9这4张照片,在t3时刻完成上传。此时该用户总共9张照片。
从图中可以直观地看到,如果在t1-t2之间的某时刻获取数据时
- 如果Direction为forward,将获取到比其更新的数据,也就是第6-9张照片;
- 如果Direction为backward,将获取到比其更老的数据,也就是第1-5张照片。
具体来讲,客户端在获取这些照片时有以下几种方式:
从老数据开始全量获取
第一次请求:
- 请求参数为Cursor = '0', Direction = 'forward', size = 5;
- 响应:第1-5张照片,NextCursor = t1;
第二次请求
- 请求参数Cursor = t1, Direction = 'forward', size = 5;
- 响应:第6-9张照片,NextCursor = t3;
第三次请求
- 请求参数Cursor = t3, Direction = 'forward', size = 5;
- 响应:NextCursor = ‘EOF’;此时客户端可以停止获取数据了。
- 注1:如果在第一次请求时指定的size=10,那么在第一次请求中就可以返回所有数据。
- 注2:这里为了理解方便,将响应中的NextCursor设置为t1或者t3,不代表实际值就是t1或t3。
从新数据开始全量获取
第一次请求:
- 请求参数为Cursor = '<当前时间戳>', Direction = 'backward', size = 5;
- 响应:第5-9张照片,NextCursor = t1;
第二次请求
- 请求参数Cursor = t1, Direction = 'backward', size = 5;
- 响应:第1-4张照片,NextCursor = t0;
第三次请求
- 请求参数Cursor = t0, Direction = 'backward', size = 5;
- 响应:NextCursor = ‘EOF’;此时客户端可以停止获取数据了。
增量获取
增量获取主要用于不同客户端之间同步数据,比如自动将手机上拍摄的照片同步到平板电脑。增量获取数据时,客户端只需在获取数据后将服务端返回的NextCursor保存起来,下次同步数据的时候将其作为Cursor即可获取到更新的数据。
我们依然以上面的图为例,只是请求的时序有所不同:
- 客户端A在t0时刻上传了第1-5这5张照片
客户端B在t1-t2之间的某个时刻开始同步数据
- 第一次请求:参数为Cursor = '0', Direction = 'forward', size = 5;返回第1-5条数据和NextCursor = t1;此时客户端需要将NextCursor的值t1保存下来。注:发送第一次请求时,客户端B本地没有缓存过的Cursor,所以它以0为Cursor开始发送请求。
- 第二次请求:参数为Cursor = t1, Direction = 'forward', size = 5;无数据返回,NextCursor = EOF。此时,客户端不更改本地缓存的NextCursor值(依然为t1)。
客户端A在t2时刻又上传了4张照片
客户端B在t3时刻之后的某个时刻开始同步数据
- 由于第2步中客户端B在本地记录了上次同步的Cursor = t1,故本次同步请求的参数为Cursor = t1, Direction = 'forward', size = 5,返回第6-9条数据。
在这个例子中,第4步返回的都是新增的记录。在实际的场景中,客户端A也可能在t1-t2之间删除某些之前上传的照片。客户端B在同步数据时,服务端也会返回删除的记录,这样客户端B就可以在本地删除掉客户端A删除的那些记录。
实现增量同步的关键点
- 客户端从智能云相册服务端获取数据后,需要将数据缓存在本地。
- 如果服务端返回的NextCursor不是EOF,则将NextCursor保存起来作为后续请求中的Cursor参数。
- 客户端根据服务端返回的数据调整本地缓存,比如新增或者删除本地缓存中的记录。
- 客户端在请求数据时,需要告知服务端它需要获取所有状态的记录。
- 如果由于某些原因客户端本地的缓存被清理了,则需要拉取数据重建本地缓存。
示例代码
请参考利用SDK来实现
分批获取数据的示例代码。