gpt4 book ai didi

ios - CloudKit 不检索应该存在且可检索的记录

转载 作者:行者123 更新时间:2023-11-28 14:29:00 25 4
gpt4 key购买 nike

我有一个在 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()
}
}

}

}

刷新()函数:

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)

我还确认,当查询开始时,predicate/"thisTeamName"应该是它的原样,即刚刚创建的记录的组名。我对为什么它无法检索/查询记录感到困惑。

最佳答案

您的刷新函数调用 loadGroupPage(),然后立即触发异步调用以重新加载表,而无需等待 loadGroupPage 函数完成,因此即使您确实获得了记录,我认为它也不会正常工作。

您没有在 loadGroupPage 函数中显示实际将请求操作添加到数据库的位置。我假设它在那里?

recordFetchedBlock 将为每条返回的记录触发一次,您不需要强制打开记录(记录:CKRecord!)。您也不需要检查 record != nil 因为它保证在那里。

CKQuery recordFetchedBlock 文档说:

Warning

Query indexes are updated asynchronously so they are not guaranteed to be current. If you query for records that you recently changed and not allow enough time for those changes to be processed, the query results may be incorrect. The results may not contain the correct records and the records may be out of order.

我无论如何都不是专家(也没有使用过便利的 API),但是我的应用程序中内置了同步功能,根据我的经验,如果问题是索引没有更新,我会感到很惊讶。

我建议添加一个 queryCompletionBlock 并在那里检查错误。在使用 CloudKit 时您应该始终检查错误,因为即使代码是正确的,仍然会有错误的时候(网络不可用、iCloud 宕机等)

关于ios - CloudKit 不检索应该存在且可检索的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51371908/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com