1

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

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

(用户可以选择不将缩略图保存到本地数据库,因为空间消耗)

4

1 回答 1

0

你不能那样做。CNContactViewController 显示的联系人是一个不可变的联系人,与您一开始创建的 CNMutableContact 没有任何联系(它是一个副本)。

于 2019-10-02T15:04:22.743 回答