如何在自定义 CNContactViewController 中异步更新图像

How to asynchronous update image in custom CNContactViewController

我的应用程序有一个本地联系人数据库,没有存储在内部联系人存储中(但是用户可以选择将联系人添加到内部联系人存储中)

我正在使用 CNContactViewController 来显示联系人的详细信息 - 但图像并不(总是)存储在数据库中,必须在每次请求时加载(异步)。

ContactModelclass的最小化版本:

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 没有任何联系(它是一个副本)。