iOS CloudKit 分页查询

对于CloundKit不熟悉的小伙伴可以参考这两篇文章,作者描述的很详细,相信你一看就会:
使用CloudKit
iOS CloudKit的使用

了解CloundKit之后,就想用CloudKit做为后台服务,写一个简单的iOS应用,仿制了一个约球的微信小程序,主要功能:

  • 创建球员基本信息
  • 获取球员列表
  • 收藏、点赞球员功能
  • 保存收藏球员列表
  • 发帖功能
  • 获取帖子列表
  • 意见反馈
Demo展示

以上功能均已实现,数据也存储在iCloud云服务上。

按照参考的文章这样的一个小demo实现起来并不困难。实现Demo的时候,数据接口都是全量拉取的,本身iCloud在国内的速度就很感人,而且我在数据库中并没有添加太多的数据。

如果随着用户的增多,数据量变得很大,显然我们不能全量拉取数据,那么CloudKit是否有分页查询的机制呢?查阅了很多资料,关于这方面的内容基本上没有,然后我就去看CloudKit的API接口,果然你能想到的,天才的苹果SDK开发工程师也都能想到。

CKQueryOPeration

我发现CKQueryOPeration有两个属性:

@NSCopying open var cursor: CKQueryOperation.Cursor?

open var resultsLimit: Int

相信看到这两个属性名,你也知道其中的奥妙了,resultsLimit相当于分页查询接口中的pageSizecursor则相当于查询的起始位置。代码实现:

// 获取球员列
 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!)
}

你可能感兴趣的:(iOS CloudKit 分页查询)