Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/97.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 CKModifyRecords操作对整批记录无效_Ios_Swift_Cloudkit - Fatal编程技术网

Ios CKModifyRecords操作对整批记录无效

Ios CKModifyRecords操作对整批记录无效,ios,swift,cloudkit,Ios,Swift,Cloudkit,据我所知,CKModifyRecordsOperation(recordsToSave:,recordsToDelete:)方法应该可以同时修改多条记录和删除多条记录 在我的代码中,recordsToSave是一个包含2个CKRecords的数组。我没有要删除的记录,因此我将recordsToDelete设置为nil。令人费解的是,recordsToSave[0]似乎正确地保存到了云中,而recordsToSave[1]却没有 要在粘贴代码之前提供更多上下文,请执行以下操作: 在我的应用程序中,

据我所知,
CKModifyRecordsOperation(recordsToSave:,recordsToDelete:)
方法应该可以同时修改多条记录和删除多条记录

在我的代码中,
recordsToSave
是一个包含2个
CKRecords
的数组。我没有要删除的记录,因此我将
recordsToDelete
设置为
nil
。令人费解的是,
recordsToSave[0]
似乎正确地保存到了云中,而
recordsToSave[1]
却没有

要在粘贴代码之前提供更多上下文,请执行以下操作:

在我的应用程序中,有一个“加入”按钮与提要上的每个帖子关联。当用户点击“加入”按钮时,会发生两个云事务:1)帖子的引用被添加到
[CKReference]
类型的
joinedList
,2)帖子的记录应该增加其
NUM_PEOPLE
属性。根据CloudKit仪表板,云事务#1正在发生,而不是#2

这是我的代码,省略了不相关的部分:

@IBAction func joinOrLeaveIsClicked(_ sender: Any) {

self.container.fetchUserRecordID() { userRecordID, outerError in
    if outerError == nil {
        self.db.fetch(withRecordID: userRecordID!) { userRecord, innerError in
            if innerError == nil {

                var joinedList: [CKReference]

                if userRecord!.object(forKey: JOINED_LIST) == nil {
                    joinedList = [CKReference]() // init an empty list
                }
                else {
                    joinedList = userRecord!.object(forKey: JOINED_LIST) as! [CKReference]
                }

                let ref = CKReference(recordID: self.post.recordID, action: .none)

                // ... omitted some of the if-else if-else ladder

                // add to list if you haven't joined already
                else if !joinedList.contains(ref) {

                    // modifying user record
                    joinedList.append(ref) // add to list
                    userRecord?[JOINED_LIST] = joinedList as CKRecordValue // associate list with user record

                    // modifying post
                    let oldCount = self.post.object(forKey: NUM_PEOPLE) as! Int
                    self.post[NUM_PEOPLE] = (oldCount + 1) as CKRecordValue

                    let operation = CKModifyRecordsOperation(recordsToSave: [userRecord!, self.post], recordIDsToDelete: nil)

                    self.db.add(operation)

                }

                    // omitted more of the if-else if-else ladder

            else {
                if let error = innerError as? CKError {
                    print(error)
                }
            }
        }
    }

    else {
        if let error = outerError as? CKError {
            print(error)
        }
    }
}
}

编辑

下面是我根据第一个评论者的请求添加的代码

operation.modifyRecordsCompletionBlock = { savedRecords, deletedRecordsIDs, error in
                            if error == nil {
                                DispatchQueue.main.async(execute: {
                                    self.num.text = String(oldCount + 1) // UI update
                                })
                            }
                            else {
                                print(error!)
                            }
                        }
另一次编辑

let operation = CKModifyRecordsOperation(recordsToSave: [userRecord!, self.post], recordIDsToDelete: nil)

                        operation.perRecordCompletionBlock = { record, error in
                            if error != nil {
                                let castedError = error as! NSError
                                print(castedError)
                            }
                        }
                        operation.modifyRecordsCompletionBlock = { savedRecords, deletedRecordsIDs, error in
                            if error == nil {
                                DispatchQueue.main.async(execute: {
                                    self.num.text = String(oldCount + 1) // UI update
                                })
                            }
                            else {
                                print(error!)
                            }
                        }

                        self.db.add(operation)

您是否实施了
perRecordCompletionBlock
和/或
modifyRecordsCompletionBlock
以检查错误?感谢您指出这一点!我添加了一些代码,我将这些代码添加到了上面底部的帖子中。UI更新未发生,因此一定有错误。但是,我的
打印(错误!)
不起作用。我在网上很难找到如何正确打印错误。我需要投吗?在我添加感叹号之前,我收到一条警告,它的类型是
Any
,我不希望出现在这里。因为您只得到一个部分错误,
error
是一个值为
partialError
的枚举。您应该记录传递到
perRecordCompletionBlock
的错误,以获取每个记录的特定错误;我没有意识到我需要这两个功能。我仍然有打印错误的问题,虽然。我在上面编辑了我的帖子,加入了我的
perRecordCompletionBlock
code。我试图将错误转换为
NSError
,希望这样可以打印出来……但仍然没有结果……哦,我要尝试
。本地化描述