У меня возникают проблемы с производительностью памяти при выполнении операций со списками областей.У меня есть два объекта, похожих на этот:
final class Contact: Object {
let phones = List<Phone>()
let emails = List<Email>()
}
Теперь я пытаюсь найти возможные сходства между двумя объектами одного типа (например, хотя бы одним общим элементом), которые потенциально могут иметь дублирующиеся электронные письма илителефоны.Для этого я использовал Set
операции.
func possibleDuplicateOf(contact: Contact) {
return !Set(emails).isDisjoint(with: Set(contact.emails)) || !Set(phones).isDisjoint(with: Set(contact.phones))
}
Это функция внутри объекта Contact
.Я знаю, что при преобразовании Списка Сфер в Набор или Массив производительность падает, и я чувствую это сильно, когда у меня большое количество контактов (10 КБ или более), потребление памяти возрастает до более чем 1 ГБ.
Итак, я попытался заменить вышеупомянутую функцию на эту:
func possibleDuplicateOf(contact: Contact) {
let emailsInCommon = emails.contains(where: contact.emails.contains)
let phonesInCommon = phones.contains(where: contact.phones.contains)
return emailsInCommon || phonesInCommon
}
Это имеет ту же производительность, что и использование наборов.
Метод 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
}
}
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
}
}
У меня немного не хватает вариантов, я потратил целый день, пытаясь придумать другой подходк этой проблеме, но без удачи.Если у кого-то есть идея получше, я бы с удовольствием выслушал ее:)
Спасибо