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