iOS CloudKit 分页查询
2019-07-13 本文已影响0人
心至靜行至遠
对于CloundKit不熟悉的小伙伴可以参考这两篇文章,作者描述的很详细,相信你一看就会:
使用CloudKit
iOS CloudKit的使用
了解CloundKit
之后,就想用CloudKit
做为后台服务,写一个简单的iOS应用,仿制了一个约球的微信小程序,主要功能:
- 创建球员基本信息
- 获取球员列表
- 收藏、点赞球员功能
- 保存收藏球员列表
- 发帖功能
- 获取帖子列表
- 意见反馈
以上功能均已实现,数据也存储在iCloud云服务上。
按照参考的文章这样的一个小demo实现起来并不困难。实现Demo的时候,数据接口都是全量拉取的,本身iCloud在国内的速度就很感人,而且我在数据库中并没有添加太多的数据。
如果随着用户的增多,数据量变得很大,显然我们不能全量拉取数据,那么CloudKit是否有分页查询的机制呢?查阅了很多资料,关于这方面的内容基本上没有,然后我就去看CloudKit的API接口,果然你能想到的,天才的苹果SDK开发工程师也都能想到。
CKQueryOPeration
我发现CKQueryOPeration有两个属性:
@NSCopying open var cursor: CKQueryOperation.Cursor?
open var resultsLimit: Int
相信看到这两个属性名,你也知道其中的奥妙了,resultsLimit
相当于分页查询接口中的pageSize
,cursor
则相当于查询的起始位置。代码实现:
// 获取球员列
func fecthPlayerList(cursor: CKQueryOperation.Cursor?, completion: (([Information]?, Error?) -> Void)?) {
var operation: CKQueryOperation?
if let cursor = cursor {
operation = CKQueryOperation(cursor: cursor)
} else {
let predicate = NSPredicate(value: true)
let query = CKQuery(recordType: "Players", predicate: predicate)
operation = CKQueryOperation(query: query)
}
// 一次拉取15条数据
operation?.resultsLimit = 15
var records: [CKRecord] = []
operation?.recordFetchedBlock = { record in
records.append(record)
}
operation?.queryCompletionBlock = { [weak self] (cursor, error) in
// 保存查询位置,分页拉取更多数据传入(没有更多数据cursor返回为空)
self?.cursor = cursor
let players = records.map { (record) -> Information in
return Information(record: record)
}
DispatchQueue.main.async {
completion?(players, error)
}
}
publicDatabase.add(operation!)
}