我有一个在CloudKit中创建新记录的功能。成功创建该记录后,它将调用一个称为refresh()的函数,该函数将调用其他函数来查询我刚刚创建的记录。但是,它说我创建了记录,但是它永远不会进入下一个查询,这告诉我新记录可能无法在查询之前及时到达CloudKit。顺便说一句,如果我要查看数据库,则记录已正确创建。
创建新的记录功能:
func saveCreatedGroup2(){
let Group = CKRecord(recordType: "Group")
print(groupName)
Group.setObject(groupName as CKRecordValue?, forKey: "groupName")
Group.setObject(groupDesc as CKRecordValue?, forKey: "groupDesc")
Group.setObject(publicOrPrivate as CKRecordValue?, forKey: "PublicOrPrivate")
Group.setObject(members as CKRecordValue?, forKey: "memberUsernames")
Group.setObject(leaders as CKRecordValue?, forKey: "leaders")
database.save(Group) { (savedRecord, error) in
if error != nil{
print(error.debugDescription)
}else{
DispatchQueue.main.async{
print("SAVED RECORD, CREATED NEW GROUP!!!!")
// IT DOES SAY THIS^
thisTeamName = selectedCellName
createdNewGroup = false
self.refresh()
}
}
}
}
refresh()函数:
func refresh(){
tempThisGroupTuple = []
sortedTupleArray = []
otherTeam = []
otherSortedArray = []
tempOtherTeamTuple = []
canSwitchViews = false
if (canRefresh == false){
print ("ABANDONED")
refreshControl.endRefreshing()
}else{
loadGroupPage()
DispatchQueue.main.async{
self.requestsTableView.reloadData()
self.groupFeedTableView.reloadData()
}
}
}
loadGroupPage()(查询刚刚创建的记录)功能-打印查询之前的行,但不打印查询内部的行!:
func loadGroupPage() {
print("loadingf group pagew...\(thisTeamName)") // PRINTS THIS
let pred = NSPredicate(format: "groupName = %@", thisTeamName)
let query = CKQuery(recordType: "Group", predicate: pred)
let operation = CKQueryOperation(query: query)
operation.qualityOfService = .userInteractive
var canJoin = false
var requestVisible = false
operation.recordFetchedBlock = { (record: CKRecord!) in
if record != nil{
self.OurGroup = record
groupMembs = (record.object(forKey: "memberUsernames") as! Array) // loads group members
print("original groupMembs: \(groupMembs)") // DOES NOT PRINT THIS LINE, SO IT IS TELLING ME IT DID NOT FIND THE RECORD
...(There's more to this function but it's unnecessary)
我还确认了查询开始时,谓词/“ thisTeamName”应该是它的名称,即刚刚创建的记录的groupName。我对为什么它无法检索/查询记录感到困惑。
答案 0 :(得分:1)
您的刷新函数调用loadGroupPage(),然后立即触发异步调用以重新加载表,而无需等待loadGroupPage函数完成,因此即使您获得记录,我也认为它无法正常工作。
您没有在loadGroupPage函数中显示将请求操作实际添加到数据库的位置。我以为在那里?
recordFetchedBlock将为返回的每个记录触发一次,您无需强行解开记录(记录:CKRecord!)。您也不必检查记录!= nil,因为它肯定会存在。
CKQuery recordFetchedBlock文档说:
警告
查询索引是异步更新的,因此不能保证它们是最新的。如果查询最近更改的记录,并且没有足够的时间来处理这些更改,则查询结果可能不正确。结果可能不包含正确的记录,并且记录可能不正确。
无论如何我都不是专家(并且没有使用过便捷API),但是已经将同步内置到我的应用程序中,仅凭我的经验,如果问题在于索引未更新,我会感到惊讶。
我建议您添加一个queryCompletionBlock并在那里检查错误。在使用CloudKit时,您应该始终检查错误,因为即使代码正确,有时还是会出现错误(网络不可用,iCloud关闭等)