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)
我在这里有点选择,我花了整整一天试图想出一个不同的方法解决这个问题,但没有运气.如果有人有更好的主意,我很想听听:)
谢谢
| 归档时间: |
|
| 查看次数: |
171 次 |
| 最近记录: |