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

问题描述 投票:0回答:1

我有一个在CloudKit中创建新记录的函数。成功创建该记录后,它会调用一个名为refresh()的函数,该函数将调用其他函数来查询我刚刚创建的记录。但是,它说我创建了记录,但它永远不会进入下一个查询,它告诉我新记录可能无法在查询之前及时到达CloudKit。顺便说一句,如果我要查看数据库,记录WAS正确创建。

创建新的记录功能:

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。我很困惑为什么它无法检索/查询记录。

ios swift cloudkit completionhandler ckrecord
1个回答
1
投票

你的刷新函数调用loadGroupPage()然后立即触发异步调用来重新加载表而不等待loadGroupPage函数完成,所以即使你得到一个记录我也不认为它会正常工作。

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

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

CKQuery recordFetchedBlock文档说:

警告

查询索引是异步更新的,因此不保证它们是最新的。如果查询最近更改的记录并且没有足够的时间处理这些更改,则查询结果可能不正确。结果可能不包含正确的记录,并且记录可能不正常。

我不是一个专家(并没有使用便利API),但已经在我的应用程序中建立了同步,根据我的经验,如果问题是索引没有更新,我会感到惊讶。

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

© www.soinside.com 2019 - 2024. All rights reserved.