首页 > 解决方案 > 公共云数据库查询不应该返回 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在这种情况下似乎不会运行。

标签: iosswifticloudcloudkit

解决方案


这里的问题是 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    
    }
}

推荐阅读