用于匹配自定义对象数组的多个属性的谓词

时间:2016-06-03 03:35:21

标签: ios swift core-data batch-processing nspredicate

我正在尝试将自定义对象数组与另一个自定义对象数组匹配。我正在使用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。那些不匹配的,将其标记为假。

非常感谢任何帮助。

0 个答案:

没有答案