此方法在连续两次调用中,一次用于电子邮件,另一次用于电话号码,尝试将该信息保存到每个联系人的单独对象因为我无法弄清楚如何将嵌套数组保存到单个Parse对象。后续PFObject.saveAll()在iOS中不起作用Swift应用程序
令人困惑的是,如果我只做电子邮件的方法,所有的保存很好。如果我只是为了电话号码而做的话,一切都可以节省。当我做电子邮件,然后手机,只有手机保存。当我做手机和电子邮件时,电子邮件会保存。
例外情况是,如果给定的联系人只有电子邮件或电话,它总是成功。注释掉指向联系人的指针并没有做任何事情来帮助,所以看起来有一些竞争条件或锁定错误与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)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
UPDATE:
这里是固定的代码,这不再通过一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
感谢您的快速响应!我想你应该说我应该添加一个fetch()或fetchAll(),然后等待保存并抓取结果 - 是吗?我添加了一个PFObject.fetchAll(),但是现在应用程序在保存第一个记录后挂起:PFObject.saveAll(parseObjects) PFObject.fetchAll(parseObjects) – 2014-10-10 06:34:55
我误解了 - 你在说“每次创建一个新对象”,哪些工作!我会用固定代码更新我的问题。再次感谢! – 2014-10-10 06:49:47
高兴地帮助,是的,你应该创建一个新的对象。 – Idali 2014-10-12 00:47:49