Мне нужен идентификатор только что созданного контакта сразу после запроса на сохранение. Вариант использования: в моем приложении пользователь создает новый контакт и дает ему некоторые атрибуты (например, имя, адрес...), после чего он может сохранить контакт. Этот сценарий работает как аспектный. Мой код выглядит так:
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)
}
}
Объект Contact (uiContact) — это всего лишь оболочка CNContact. В завершении закрытия мне нужно вернуть идентификатор, но в этот раз я не имею к ним доступа, потому что он создается системой после процесса записи. Одним из решений может быть получение только что сохраненного CNContact с предикатом
public func unifiedContactsMatchingPredicate(predicate: NSPredicate, keysToFetch keys: [CNKeyDescriptor]) throws -> [CNContact]
но мне это кажется немного нечистым, потому что у этого контакта может быть только имя, и может существовать более одного. Что-то вроде обратного вызова с созданным идентификатором было бы неплохо. Но нет. Есть ли другой способ решить эту проблему?