我们说我有一个拥有2个实体的体育应用程序。 (这纯粹是一个例子)
团队和球员。
class Team:NSManagedObject{
@NSManaged var name:String
@NSManaged var players:NSSet
}
class Player:NSManagedObject{
@NSManaged var firstName:String
@NSManaged var lastName:String
@NSManaged var playsFor:NSSet
}
每支球队都有一组球员。 每个球员都有一组球队。
所以从本质上讲,我有两个多对多的关系。如果只有一个,我可以使用反向将对象插入其集合中,没有任何麻烦。
由于这些对象的这种悲伤的双重多对多结构,我发现自己陷入困境。现在在有人说我应该拿一个中间对象并与该对象做一对多去除第二个对象之前,我很乐意这样做,但是,在这种情况下,我不能,所以我&# 39;我想打开如何解决这个特殊问题的话题。
我尝试了两次不同的尝试。
最大的问题是玩家的类型是NSSet,我不能只做一个addObject,因为NSSet是不可变的。
我的第一个想法如下:
func addPlayer(player: Player) {
var allPlayers = self.players.allObjects
allPlayers.append(player)
self.players = NSSet(array: allPlayers)
}
现在这在多个级别上都很糟糕。所以我马上继续前进。
我的下一个想法是,显然将NSSet再次添加到一个数组再添加一个项目是不好的,所以我将Team
的数据模型更改为
@NSManagedObject var players:Set<Player>
然后我的方法被简化为:
func addPlayer(player: Player) {
self.players.addObject(player)
}
我真的很喜欢这个,直到我打开探查器并且我的执行时间实际上变得非常糟糕。
所以我接下来的尝试是以下几点,明确地将管理对象的类型保留为NSSet会给你带来一些显着的好处,所以我不再那么捣乱了。
func addPlayer(player: Players) {
let allPlayers = NSMutableSet(set: self.players)
allPlayers.addObject(player)
self.players = allPlayers
}
我从最后一次改变中获得了一个小速度撞击但我仍然不满意。还有哪些其他优化可能?有什么想法吗?
实际上,我正在使用一个非常旧的数据库来处理应用程序,该数据库包含数十万个我们无法控制重构的对象。我试图在不完全重新处理数据模型和破坏前端的情况下进行优化。任何帮助建议或想法将不胜感激。