【问题标题】:Subsequent PFObject.saveAll() doesn't work in iOS Swift app随后的 PFObject.saveAll() 在 iOS Swift 应用程序中不起作用
【发布时间】:2014-10-09 04:56:10
【问题描述】:

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

较早的方法调用此方法两次:

updateMultiField(person, parseObject: multis, fieldToGrab: kABPersonPhoneProperty, contact: contact)
updateMultiField(person, parseObject: multis, fieldToGrab: kABPersonEmailProperty, contact: contact)

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~

更新:

这里是固定代码,它不再将 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

【问题讨论】:

    标签: ios swift parse-platform


    【解决方案1】:

    您似乎试图保存相同的 parseObject 2 次,而没有在两者之间检索它。最后一次保存将始终被忽略,因为您尝试保存的对象已过时(最新版本已在服务器上)。

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

    【讨论】:

    • 感谢您的快速响应!我想你是说我应该添加一个 fetch() 或 fetchAll(),然后等待保存并获取结果 - 对吗?我添加了一个 PFObject.fetchAll() 但应用程序现在在保存第一条记录后挂起:PFObject.saveAll(parseObjects) PFObject.fetchAll(parseObjects)
    • 我误解了——你说的是“每次都创建一个新对象”,这很有效!我将使用固定代码更新我的问题。再次感谢!
    • 很高兴为您提供帮助,是的,您应该创建一个新对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多