首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CKQueryOperation queryCompletionBlock返回零游标

CKQueryOperation queryCompletionBlock返回零游标
EN

Stack Overflow用户
提问于 2020-04-19 14:51:38
回答 1查看 120关注 0票数 0

我正在用CloudKit获取一个CKQueryOperation数据库。由于某些原因,每次我按下“获取”按钮时,都会第一次得到零光标。第二次获取和获取数据时,一切都很好。当我检查recordFetchedBlock时,它确实得到了结果并追加了它们,但是在最后,数组是空的。我不明白为什么会这样。我想立即显示结果,因为他们已经被获取。我认为问题是与零光标,但我开放给其他建议。这是我的密码:

代码语言:javascript
复制
public class CloudKitDatabase {

static let shared = CloudKitDatabase()

var records = [CKRecord]()

let publicData = CKContainer.default().publicCloudDatabase

init() {
    self.fetchRecords()
}

func fetchRecords() {

    let predicate = NSPredicate(value: true)
    let query = CKQuery(recordType: "OECD", predicate: predicate)

    let queryOperation = CKQueryOperation(query: query)

    queryOperation.recordFetchedBlock = {
        record in
        self.records.append(record)


    }

    queryOperation.queryCompletionBlock = { cursor, error in
        DispatchQueue.main.async {
            if error != nil {
                print(error.debugDescription)
            } else {
                if cursor != nil {
                    self.queryServer(cursor!)
                } else {
                    print("CURSOR IS NIL")
                }
            }
        }

    }
    self.publicData.add(queryOperation)
}


func queryServer(_ cursor: CKQueryOperation.Cursor) {
    let queryOperation = CKQueryOperation(cursor: cursor)

    queryOperation.recordFetchedBlock = {
        record in
        self.records.append(record)

    }

    queryOperation.queryCompletionBlock = { cursor, error in
        DispatchQueue.main.async {
            if error != nil {
                print(error.debugDescription)
            } else {
                if cursor != nil {
                    self.queryServer(cursor!)
                } else {
                    print("CURSOR IS NIL")
                }
            }
        }
    }
    self.publicData.add(queryOperation)

}

调试区域告诉我:游标为零,CloudKitDatabase.shared.records.isEmpty为真。

EN

回答 1

Stack Overflow用户

发布于 2020-04-20 05:48:50

首先,尝试一些关于第一次查询的信息;

代码语言:javascript
复制
   let queryOperation = CKQueryOperation(query: query)
   queryOperation.queuePriority = .veryHigh
   queryOperation.resultsLimit = 99 // built in limit is 400  

接下来,不要在分派中执行游标调用,并包括完成;

代码语言:javascript
复制
queryOperation.queryCompletionBlock =
{ cursor, error in

        if error != nil {
            print(error.debugDescription)
        } else {
            if cursor != nil {
                self.queryServer(cursor!)
            } else {
                print("CURSOR IS NIL")
                completion(nil)
            }
        }
}

和;

代码语言:javascript
复制
queryOperation.queryCompletionBlock = 
{ cursor, error in

        if error != nil {
            print(error.debugDescription)
        } else {
            if cursor != nil {
                self.queryServer(cursor!)
            } else {
                print("CURSOR IS NIL")
                completion(nil)
            }
        }

}

另外,不要忘记在fetchRecords开始时清空记录数组,否则连续调用将在数组中得到相同的记录。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61306346

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档