我的应用程序有一个本地联系人数据库,未存储在内部联系人存储中(但用户可以选择将联系人添加到内部联系人存储中)
我正在使用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
则图像将完美显示 - 但如果之后更改任何值,则视图不会更新。
(用户可以选择不将缩略图保存到本地数据库,因为空间消耗)