【发布时间】: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