Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/105.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios CloudKit无法检索应存在且可检索的记录_Ios_Swift_Cloudkit_Completionhandler_Ckrecord - Fatal编程技术网

Ios 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

我有一个在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()
    }
    }
}
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/等不是用于本地缓存/存储吗?我是说在这里做这件事的目的是什么?不必维护本地存储?使用“在线优先”简化代码?