新しく作成した連絡先の識別子が保存要求の直後に必要です。ユースケース:私のアプリ内で、ユーザーは新しい連絡先を作成し、連絡先を保存できるようになった後にいくつかの属性(たとえば、名前、住所など)を与えます。このシナリオは、アスペクトとして機能しています。私のコードは次のようになります:iOS9連絡先新しく保存された連絡先から識別子を取得する
func createContact(uiContact: Contact, withImage image:UIImage?, completion: String -> Void)
{
let contactToSave = uiContact.mapToCNContact(CNContact()) as! Cnmutablecontawctlet
if let newImage = image
{
contactToSave.imageData = UIImageJPEGRepresentation(newImage, 1.0)
}
request = CNSaveRequest()
request.addContact(contactToSave, toContainerWithIdentifier: nil)
do
{
try self.contactStore.executeSaveRequest(request)
print("Successfully saved the CNContact")
completion(contactToSave.identifier)
}
catch let error
{
print("CNContact saving faild: \(error)")
completion(nil)
}
}
コンタクトオブジェクト(uiContact)はCNContactの単なるラッパーです。 終了時に識別子を返す必要がありますが、この時点では、書き込み処理後にシステムが作成しているため、アクセスできません。 一つの解決策は、述語
public func unifiedContactsMatchingPredicate(predicate: NSPredicate, keysToFetch keys: [CNKeyDescriptor]) throws -> [CNContact]
に新しく保存されたCNContactを取得することができるが、この接触は名前だけ、1つが存在する可能性以上のものを持っている可能性があるため、これは汚れたビットのように私には思えます。作成された識別子を持つコールバックのようなものは素晴らしいでしょう。しかし、そうではありません。 この問題を解決する他の方法はありますか?