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

时间:2018-07-17 01:12:40

标签: ios swift cloudkit completionhandler ckrecord

我有一个在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。我对为什么它无法检索/查询记录感到困惑。

1 个答案:

答案 0 :(得分:1)

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

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

recordFetchedBlock将为返回的每个记录触发一次,您无需强行解开记录(记录:CKRecord!)。您也不必检查记录!= nil,因为它肯定会存在。

CKQuery recordFetchedBlock文档说:

  

警告

     

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

无论如何我都不是专家(并且没有使用过便捷API),但是已经将同步内置到我的应用程序中,仅凭我的经验,如果问题在于索引未更新,我会感到惊讶。

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