如何在自定义 CNContactViewController 中异步更新图像
How to asynchronous update image in custom CNContactViewController
我的应用程序有一个本地联系人数据库,没有存储在内部联系人存储中(但是用户可以选择将联系人添加到内部联系人存储中)
我正在使用 CNContactViewController
来显示联系人的详细信息 - 但图像并不(总是)存储在数据库中,必须在每次请求时加载(异步)。
ContactModel
class的最小化版本:
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
中设置的,则图像会完美显示 - 但如果之后更改了任何值,则视图不会更新。
(由于space消耗,用户可以选择不保存缩略图到本地数据库)
你不能那样做。 CNContactViewController 显示的联系人是不可变联系人,与您一开始创建的 CNMutableContact 没有任何联系(它是一个副本)。
我的应用程序有一个本地联系人数据库,没有存储在内部联系人存储中(但是用户可以选择将联系人添加到内部联系人存储中)
我正在使用 CNContactViewController
来显示联系人的详细信息 - 但图像并不(总是)存储在数据库中,必须在每次请求时加载(异步)。
ContactModel
class的最小化版本:
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
中设置的,则图像会完美显示 - 但如果之后更改了任何值,则视图不会更新。
(由于space消耗,用户可以选择不保存缩略图到本地数据库)
你不能那样做。 CNContactViewController 显示的联系人是不可变联系人,与您一开始创建的 CNMutableContact 没有任何联系(它是一个副本)。