后续的PFObject.saveAll()不';无法在iOS Swift应用程序中工作

后续的PFObject.saveAll()不';无法在iOS Swift应用程序中工作,ios,swift,parse-platform,Ios,Swift,Parse Platform,此方法连续调用两次,一次用于电子邮件,另一次用于电话号码,试图将每个联系人的信息保存到单独的对象中,因为我不知道如何将嵌套数组保存到单个解析对象中 令人费解的是,如果我只做电子邮件的方法,所有的保存都很好。如果我只做电话号码,一切都很好。当我发电子邮件和打电话时,只有电话能保存。当我打电话和发电子邮件时,电子邮件会保存 例外情况是,如果某个联系人只有一封电子邮件或一部电话,那么它总是成功的。注释掉指向联系人的指针并没有任何帮助,所以这里的Parse似乎存在一些竞争条件或锁定错误 有什么想法吗?如

此方法连续调用两次,一次用于电子邮件,另一次用于电话号码,试图将每个联系人的信息保存到单独的对象中,因为我不知道如何将嵌套数组保存到单个解析对象中

令人费解的是,如果我只做电子邮件的方法,所有的保存都很好。如果我只做电话号码,一切都很好。当我发电子邮件和打电话时,只有电话能保存。当我打电话和发电子邮件时,电子邮件会保存

例外情况是,如果某个联系人只有一封电子邮件或一部电话,那么它总是成功的。注释掉指向联系人的指针并没有任何帮助,所以这里的Parse似乎存在一些竞争条件或锁定错误

有什么想法吗?如果可能的话,我也很想学习如何使用嵌套数组进行解析,但我尝试了一些方法,却不知道如何使其工作

func updateMultiField(person: ABRecord, parseObject: PFObject, fieldToGrab: ABPropertyID, contact: PFObject){
    var multiArray:ABMultiValueRef = extractABMultiRef(ABRecordCopyValue(person, fieldToGrab))!
    var parseObjects: [PFObject] = [PFObject]()
    for (var j = 0; j < ABMultiValueGetCount(multiArray); ++j){
        var multi =  MultiRef()
        var multiValueRaw = ABMultiValueCopyValueAtIndex(multiArray, j)
        multi.value = extractMultiValue(multiValueRaw)

        if (multi.value != nil) {
            //get type
            multi.type = getMultiType(fieldToGrab)
            //get label
            multi.label = extractMultiLabel(ABMultiValueCopyLabelAtIndex(multiArray, j))
            //get id
            multi.id = String(Int(ABMultiValueGetIdentifierAtIndex(multiArray, j)))

            parseObject[parseContactIdFieldName] = contact
            parseObject[labelFieldName] = multi.label
            parseObject[valueFieldName] = multi.value
            parseObject[multiIdFieldName] = multi.id
            parseObject[typeFieldName] = multi.type
            println("\(multi.type) multi about to be saved with value of \(multi.value)")
            parseObjects.insert(parseObject, atIndex: j)
            //save
        }//if
    }//for
    PFObject.saveAll(parseObjects)
}//updateField
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

更新:

下面是固定代码,它不再将PFObject传递到方法中,并尝试反复保存同一个对象,而是在for循环(第5行)中实例化它,从而解决了问题:

func updateMultiField(person: ABRecord, fieldToGrab: ABPropertyID, contact: PFObject){
    var multiArray:ABMultiValueRef = extractABMultiRef(ABRecordCopyValue(person, fieldToGrab))!
    var parseObjects: [PFObject] = [PFObject]()
    for (var j = 0; j < ABMultiValueGetCount(multiArray); ++j){
        var parseObject = PFObject(className: multisObjectName)
        var multi =  MultiRef()
        var multiValueRaw = ABMultiValueCopyValueAtIndex(multiArray, j)
        multi.value = extractMultiValue(multiValueRaw)

        if (multi.value != nil) {
            //get type
            multi.type = getMultiType(fieldToGrab)
            //get label
            multi.label = extractMultiLabel(ABMultiValueCopyLabelAtIndex(multiArray, j))
            //get id
            multi.id = String(Int(ABMultiValueGetIdentifierAtIndex(multiArray, j)))

            parseObject[parseContactIdFieldName] = contact
            parseObject[labelFieldName] = multi.label
            parseObject[valueFieldName] = multi.value
            parseObject[multiIdFieldName] = multi.id
            parseObject[typeFieldName] = multi.type
            println("\(multi.type) multi about to be saved with value of \(multi.value)")
            parseObjects.insert(parseObject, atIndex: j)
        }//if
    }//for
    PFObject.saveAll(parseObjects)
}//updateMultiField
func updateMultiField(个人:ABRecord,fieldToGrab:ABPropertyID,联系人:PFObject){
var multiArray:ABMultiValueRef=extractABMultiRef(ABRecordCopyValue(person,fieldToGrab))!
var parseObjects:[PFObject]=[PFObject]()
对于(var j=0;j
您似乎试图保存同一个parseObject两次,但中间没有检索到它。最后一次保存将始终被忽略,因为您尝试保存的对象已过时(服务器上已存在最新版本)


您应该从服务器检索parseObject,然后再次更改和保存。

感谢您的快速响应!我想你是说我应该添加一个fetch()或fetchAll(),然后等待保存并获取结果,对吗?我添加了一个PFObject.fetchAll(),但在保存第一条记录后,应用程序现在挂起:PFObject.saveAll(parseObjects)PFObject.fetchAll(parseObjects)我误解了-你说的是“每次创建一个新对象”,这很有效!我将用固定代码更新我的问题。再次感谢!很高兴提供帮助,是的,您应该创建一个新对象。
func updateMultiField(person: ABRecord, fieldToGrab: ABPropertyID, contact: PFObject){
    var multiArray:ABMultiValueRef = extractABMultiRef(ABRecordCopyValue(person, fieldToGrab))!
    var parseObjects: [PFObject] = [PFObject]()
    for (var j = 0; j < ABMultiValueGetCount(multiArray); ++j){
        var parseObject = PFObject(className: multisObjectName)
        var multi =  MultiRef()
        var multiValueRaw = ABMultiValueCopyValueAtIndex(multiArray, j)
        multi.value = extractMultiValue(multiValueRaw)

        if (multi.value != nil) {
            //get type
            multi.type = getMultiType(fieldToGrab)
            //get label
            multi.label = extractMultiLabel(ABMultiValueCopyLabelAtIndex(multiArray, j))
            //get id
            multi.id = String(Int(ABMultiValueGetIdentifierAtIndex(multiArray, j)))

            parseObject[parseContactIdFieldName] = contact
            parseObject[labelFieldName] = multi.label
            parseObject[valueFieldName] = multi.value
            parseObject[multiIdFieldName] = multi.id
            parseObject[typeFieldName] = multi.type
            println("\(multi.type) multi about to be saved with value of \(multi.value)")
            parseObjects.insert(parseObject, atIndex: j)
        }//if
    }//for
    PFObject.saveAll(parseObjects)
}//updateMultiField