领域列表中的性能问题

Dio*_*nes 5 set realm swift realm-list

在Realm List上进行操作时,我遇到了一些内存性能问题.我有两个类似于这个的对象:

final class Contact: Object {
    let phones = List<Phone>()
    let emails = List<Email>()
}
Run Code Online (Sandbox Code Playgroud)

现在我试图找到可能有重复电子邮件或电话的两个相同类型的对象(例如,至少一个共同的元素)之间可能的相似性.为了做到这一点,我正在使用Set操作.

func possibleDuplicateOf(contact: Contact) {
    return !Set(emails).isDisjoint(with: Set(contact.emails)) || !Set(phones).isDisjoint(with: Set(contact.phones))
}
Run Code Online (Sandbox Code Playgroud)

这是Contact对象内部的一个函数.我知道它在将Realm List转换为Set或Array时会有性能损失,当我有大量的Contacts(10k或更多)时,我会感觉很重,内存消耗会跳到1GB以上.

所以我尝试用这个替换上面的函数:

func possibleDuplicateOf(contact: Contact) {
    let emailsInCommon = emails.contains(where: contact.emails.contains)
    let phonesInCommon = phones.contains(where: contact.phones.contains)

    return emailsInCommon || phonesInCommon
}
Run Code Online (Sandbox Code Playgroud)

这与使用集合具有相同的性能.

电子邮件和电话上的isEqual方法是一个简单的字符串比较:

extension Email {
    static func ==(lhs: Email, rhs: Email) -> Bool {
        return (lhs.email == rhs.email)
    }

    override func isEqual(_ object: Any?) -> Bool {
        guard let object = object as? Email else { return false }

        return object == self
    }

    override var hash: Int {
        return email.hashValue
    }
}
Run Code Online (Sandbox Code Playgroud)

Email.swift

final class Email: Object {

enum Attribute: String { case primary, secondary }

@objc dynamic var email: String = ""
@objc dynamic var label: String = ""

/* Cloud Properties */
@objc dynamic var attribute_raw: String = ""
var attribute: Attribute {
    get {
        guard let attributeEnum = Attribute(rawValue: attribute_raw) else { return .primary }
        return attributeEnum
    }
    set { attribute_raw = newValue.rawValue }
}

override static func ignoredProperties() -> [String] {
    return ["attribute"]
}

convenience init(email: String, label: String = "email", attribute: Attribute) {
        self.init()

        self.email = email
        self.label = label
        self.attribute = attribute
    }
}
Run Code Online (Sandbox Code Playgroud)

我在这里有点选择,我花了整整一天试图想出一个不同的方法解决这个问题,但没有运气.如果有人有更好的主意,我很想听听:)

谢谢