我在弄清楚如何使用 Realm 将普通的快速过滤代码转换为 NSPredicate 查询时遇到了一些麻烦。我已经提供了数据结构的简化示例。我的目标是找出设备上的哪些用户联系人已为我的应用程序注册。
class User: Object {
let contacts = List<Contact>()
}
class Contact: Object {
let numbers = List<String>()
}
每个用户对象都包含一个“联系人”列表,其中是当前存储在用户设备上的所有联系人。每个“联系人”对象都有一个“号码”列表,因为每个联系人可以有多个电话号码。
在常规 swift 代码中,确定哪些用户联系人已经为我的应用注册,如下所示:
func alreadyRegistertedUserContacts(_ contacts: Results<Contact>,
allUsers: Results<User>) -> [Contact] {
return contacts.filter { (contact) -> Bool in
return contact.numbers.contains(where: { (number) -> Bool in
return allUsers.contains(where: { (user) -> Bool in
return user.phoneNumber == number
})
})
}
}
所以问题是,为了提高效率,我如何更改此函数以使用 NSPredicates?
预先感谢您的帮助!
最佳答案
Realm 目前不支持在其谓词中使用类型为基元列表的属性。在解除该限制之前,无法单独使用 NSPredicate
来过滤对象。
如果您愿意像这样更改模型:
class StringObject: Object {
@objc dynamic var string = ""
}
class Contact: Object {
let numbers = List<StringObject>()
}
class User: Object {
let contacts = List<Contact>()
}
这应该允许您像这样执行过滤:
return contacts.filter("ANY numbers.value IN %@",
allUsers.flatMap { return $0.phoneNumber })
关于swift - 使用 Realm Swift 进行 NSPredicate 过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48253891/