私のアプリには、内部の連絡先ストアに保存されていない連絡先のローカル データベースがあります (ただし、ユーザーは連絡先を内部の連絡先ストアに追加することを選択できます)
を使用しCNContactViewController
て連絡先の詳細を表示していますが、画像は (常に) データベースに保存されるわけではなく、リクエストごとに (非同期で) ロードする必要があります。
ContactModel
クラスの最小化されたバージョン:
class ContactModel {
var id: String
var givenName: String?
var thumbnail: Data?
init?(_ identifier: String?, givenName: String? = nil)
{
if ((identifier ?? "").isEmpty) {
return nil
}
self.id = identifier
}
func toMutableContact() -> CNMutableContact
{
let contact = CNMutableContact()
contact.contactType = .person
contact.givenName = givenName
if let thumbnail = thumbnail {
contact.imageData = thumbnail
}
return contact
}
}
次のコードは、連絡先の詳細を表示し、オンライン サービスからサムネイルを取得します。
func showContact(_ model : ContactModel)
{
// Create a 'CNMutableContact' from the 'ContactModel' object
let contact : CNMutableContact = model.toMutableContact()
let store = CNContactStore()
let cvc = CNContactViewController(forUnknownContact: contact)
cvc.delegate = self
cvc.contactStore = CNContactStore()
cvc.allowsEditing = false
self.navigationController?.pushViewController(cvc, animated: true)
var hasThumbnail: Bool = false
if let _ = model.thumbnail {
hasThumbnail = true
}
if !hasThumbnail {
// Get the thumbnail from the online service
getThumbnail(id: model.id) { (data, error) in
// Everything above works as expected!
// This does not work either
contact.givenName = "XXX"
if let data = data {
// How can I update the image ?
print("imageDataAvailable (before): \(contact.imageDataAvailable)") // returns: false
contact.imageData = data
print("imageDataAvailable (after): \(contact.imageDataAvailable)") // returns: true
}
}
}
}
連絡先を内部の連絡先ストアに保存するつもりはありません。 を使用しCNContactViewController
て詳細を表示するだけです。
で画像が設定されている場合、ContactModel
画像は完全に表示されますが、後で値が変更された場合、ビューは更新されません。
(ユーザーは、スペースを消費するため、サムネイルをローカル データベースに保存しないことを選択できます)