Ios CloudKit无法检索应存在且可检索的记录
我有一个在CloudKit中创建新记录的函数。成功创建该记录后,它将调用名为refresh()的函数,该函数将调用查询我刚才创建的记录的其他函数。然而,它说是我创建的记录,但它从来没有进入下一个查询,这告诉我新记录可能在被查询之前没有及时到达CloudKit。顺便说一句,如果我在数据库中查找,记录是正确创建的 创建新记录功能:Ios CloudKit无法检索应存在且可检索的记录,ios,swift,cloudkit,completionhandler,ckrecord,Ios,Swift,Cloudkit,Completionhandler,Ckrecord,我有一个在CloudKit中创建新记录的函数。成功创建该记录后,它将调用名为refresh()的函数,该函数将调用查询我刚才创建的记录的其他函数。然而,它说是我创建的记录,但它从来没有进入下一个查询,这告诉我新记录可能在被查询之前没有及时到达CloudKit。顺便说一句,如果我在数据库中查找,记录是正确创建的 创建新记录功能: func saveCreatedGroup2(){ let Group = CKRecord(recordType: "Group") print(gro
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()
}
}
}
}
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()
}
}
}
refresh()函数:
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()
}
}
}
}
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”应该是它本身,它是刚刚创建的记录的组名。我不明白为什么它不能检索/查询记录。您的刷新函数调用loadGroupPage(),然后立即启动一个异步调用来重新加载表,而不等待loadGroupPage函数完成。因此,即使您得到了一条记录,我认为它也无法正常工作 在loadGroupPage函数中不显示实际将请求操作添加到数据库的位置。我想那在里面吧 recordFetchedBlock将为每个返回的记录触发一次,您不需要强制展开该记录(记录:CKRecord!)。您也不需要检查记录!=零,因为它保证会在那里 CKQuery recordFetchedBlock文档说明: 警告 查询索引是异步更新的,因此不保证它们是最新的。如果查询最近更改的记录,但没有足够的时间处理这些更改,则查询结果可能不正确。结果可能不包含正确的记录,并且记录可能出现故障 无论如何,我都不是专家(也没有使用便利API),但我已经在我的应用程序中内置了同步功能。根据我的经验,如果索引没有更新,我会感到惊讶
我建议添加queryCompletionBlock并检查其中的错误。在使用CloudKit时,您应该始终检查错误,因为即使代码正确,也会出现错误(网络不可用、iCloud关闭等)1)重新加载表应该无关紧要,因为查询中的打印行没有被调用。2) 是的,最后。3) 不必要的4)可能是问题5)我已经有了一个检查错误的完成块。Sooooooo…..所以您没有收到任何错误,没有返回任何记录,但当您检查它时,记录存在。我猜你只是在查询所有存在的记录?也不返回任何内容?那么在创建记录后不立即执行查询又如何呢。我仍然怀疑这是一个索引问题——当我做了这些事情(尽管我没有使用便利API)后,事情似乎会立即返回,我只是在解决这个问题。仍然有问题,但不太关心它。谢谢你的帮助这可能适用于你的情况。同样的问题。重复。为什么要先存储记录,然后在同一个应用程序中立即检索记录?Cloudkit不是用于传输,CoreData/Realm/simple structs/等不是用于本地缓存/存储吗?我是说在这里做这件事的目的是什么?不必维护本地存储?使用“在线优先”简化代码?