我正在用CloudKit获取一个CKQueryOperation数据库。由于某些原因,每次我按下“获取”按钮时,都会第一次得到零光标。第二次获取和获取数据时,一切都很好。当我检查recordFetchedBlock时,它确实得到了结果并追加了它们,但是在最后,数组是空的。我不明白为什么会这样。我想立即显示结果,因为他们已经被获取。我认为问题是与零光标,但我开放给其他建议。这是我的密码:
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为真。
发布于 2020-04-20 05:48:50
首先,尝试一些关于第一次查询的信息;
let queryOperation = CKQueryOperation(query: query)
queryOperation.queuePriority = .veryHigh
queryOperation.resultsLimit = 99 // built in limit is 400 接下来,不要在分派中执行游标调用,并包括完成;
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)
}
}
}和;
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开始时清空记录数组,否则连续调用将在数组中得到相同的记录。
https://stackoverflow.com/questions/61306346
复制相似问题