ios - 公共云数据库查询不应该返回 nil
问题描述
我想检查是否存在具有某个谓词的记录,如果不存在,请执行以下操作:
let publicDatabase = CKContainer.default().publicCloudDatabase
let predicate: NSPredicate!
predicate = NSPredicate(format: "username == %@", usernameText)
let query = CKQuery(recordType: "user", predicate: predicate)
let configuration = CKQueryOperation.Configuration()
configuration.allowsCellularAccess = true
configuration.qualityOfService = .userInitiated
let queryOperation = CKQueryOperation(query: query)
queryOperation.desiredKeys = ["username"]
queryOperation.queuePriority = .veryHigh
queryOperation.configuration = configuration
queryOperation.resultsLimit = 1
queryOperation.recordFetchedBlock = { (record: CKRecord?) -> Void in
if let record = record {
// #1
print("record \(record)")
} else {
// #2
print("none exists")
}
}
queryOperation.queryCompletionBlock = { (cursor: CKQueryOperation.Cursor?, error: Error?) -> Void in
if let error = error {
print("\(error)")
return
}
if let cursor = cursor {
print("cursor: \(cursor)")
}
}
publicDatabase.add(queryOperation)
当存在与谓词匹配的记录时,该记录会按应有的方式返回,但是当它不存在时,甚至不会nil
返回让我做出相应的反应。我的意思是理想情况下我想在#2 中执行我的代码以响应不存在任何记录,但recordFetchedBlock
在这种情况下似乎不会运行。
解决方案
这里的问题是 recordFetchedBlock 仅在您获得记录时才被调用。没有记录?然后它不会被调用。以下方法应该为您解决问题:
//define an array to store all records
var allRecords = []
queryOperation.recordFetchedBlock = { record in
//called once for each record
//if no results, then it is never called
//if you get a record, add to the array
allRecords.append[record]
}
//the query completion block is called at the end of the query (or when all results can't be returned in one block, then called with non-nil cursor value. Considering that out of scope for this answer.
queryOperation.queryCompletionBlock = { (cursor: CKQueryOperation.Cursor?, error: Error?) in
if let error = error {
//handle error
}
if let cursor = cursor {
//handle cursor if exists
}
if allRecords.count == 0 {
//my query returned no results
//take desired action
}
}
推荐阅读
- android - 我该如何克服这个用于裁剪图像的依赖性问题?
- apache-kafka - Haproxy 背后的 Spring Cloud Stream Kafka Broker
- jquery - 无法使用 Vivus 为 Font Awesome 图标设置动画
- go - 为什么在 goroutine 的 select 中有一个 default 子句会使其变慢?
- python-3.x - ValueError:在交叉验证时设置具有序列错误的数组元素
- restful-authentication - 使用制表键不适用于 Prime-react 可编辑数据表
- java - 从java中的列表或arraylist中删除中间元素的最佳方法?
- java - Neo4j:关系属性错误:属性值只能是原始类型或其数组
- php - Wordpress Navigation Walker 将 ul、li 更改为 div 和锚标签
- android - RetroFit 呼叫在第一次后失败