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

Ios 如何在自定义CNContactViewController中异步更新映像,ios,swift,cncontactviewcontroller,Ios,Swift,Cncontactviewcontroller,我的应用程序有一个本地联系人数据库,该数据库未存储在内部联系人存储中(但用户可以选择将联系人添加到内部联系人存储中) 我正在使用CNContactViewController来显示联系人的详细信息,但图像并不(总是)存储在数据库中,必须在每次请求时加载(异步) ContactModel类的简化版本: class ContactModel { var id: String var givenName: String? var thumbnail: Data? i

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

我正在使用
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
中设置了图像,则图像将完美显示-但如果随后更改了任何值,则视图不会更新


(由于占用空间,用户可以选择不将缩略图保存到本地数据库)

您不能这样做。CNContactViewController显示的联系人是一个不可变的联系人,与您在开始时创建的CNMutableContact没有连接(它是一个副本)。

您不能这样做。CNContactViewController显示的联系人是一个不可变的联系人,与您在开始时创建的CNMutableContact没有连接(它是一个副本)。

我已更改代码…我已更改代码…谢谢。。。我希望我能做点什么。。。我现在正在尝试重新制作CNContactViewControllerHanks的UI。。。我希望我能做点什么。。。我现在正在尝试重新制作CNContactViewController的UI