我正在尝试将自定义对象数组与另一个自定义对象数组匹配。我正在使用CoreData,我存储了一些Person
个对象。然后,我下载并创建另一个类型为OnlinePerson
的自定义对象数组。我需要过滤我本地存储的Person
数组并更改他们的' isFriend' bool值为true。
作为模板代码,请说这是两个类:
class Person{
var name : String!
var surname : String!
var houseNumber : Int!
var isFriend : Bool! = false
init(name : String, surname : String, houseNumber : Int){
self.name = name
self.surname = surname
self.houseNumber = houseNumber
}
}
class OnlinePerson{
var name : String!
var surname : String!
var houseNumber : Int!
init(name : String, surname : String, houseNumber : Int){
self.name = name
self.surname = surname
self.houseNumber = houseNumber
}
}
然后添加一些虚拟数据:
var localPersons = [Person]()
for i in 0..<10{
localPersons.append(Person(name: "John \(i)", surname: "Doe \(i * 2)", houseNumber: i))
}
var onlinePersons = [OnlinePerson]()
// Add some items that should match locally
for i in 0..<5{
onlinePersons.append(OnlinePerson(name: "John \(i)", surname: "Doe \(i * 2)", houseNumber : i))
}
// Add new items
for i in 0..<5{
onlinePersons.append(OnlinePerson(name: "John \(i)", surname: "Doe \(i)", houseNumber: i*3))
}
我尝试使用这个NSPredicate
,它在Playgrounds中运行良好但不能与CoreData一起使用,因为你不能在CoreData中使用块谓词:
let predicate = NSPredicate { (person, dict) -> Bool in
if let person = person as? Person{
for onlinePerson in onlinePersons{
if person.name == onlinePerson.name && person.surname == onlinePerson.surname && person.houseNumber == onlinePerson.houseNumber{
return true
}
}
}
return false
}
let results = localPersons.filter({ predicate.evaluateWithObject($0) })
如何创建NSPredicate
来完成此类任务?我已经四处搜索了但我能找到的所有答案都匹配String
s的数组(不是自定义对象数组。
目前,作为临时解决方案,我使用常规NSFetchRequest获取所有Person
个对象。然后我将它们与下载的OnlinePerson
对象匹配,如果它们匹配,则将isFriend设置为true,否则将其设置为false。然后我保存上下文。但是,我已经通过批量更新而不是获取和匹配每个Person
对象来提高效率。
最后,我希望所有与下载的OnlinePerson对象匹配的本地Person对象标记为isFriend = true。那些不匹配的,将其标记为假。
非常感谢任何帮助。