Ios 将对象插入NSSet';s在Swift中具有多对多关系
假设我有一个带有2个实体的体育应用程序。(这纯粹是一个例子) 球队和球员Ios 将对象插入NSSet';s在Swift中具有多对多关系,ios,swift,many-to-many,nsset,Ios,Swift,Many To Many,Nsset,假设我有一个带有2个实体的体育应用程序。(这纯粹是一个例子) 球队和球员 class Team:NSManagedObject{ @NSManaged var name:String @NSManaged var players:NSSet } class Player:NSManagedObject{ @NSManaged var firstName:String @NSManaged var lastName:String @NSManaged va
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
}
每个队都有一组队员。
每个球员都有一组他们效力的球队
所以本质上,我有两个多对多的关系。如果只有一个,我就可以使用反转将对象插入到它的集合中,而不会有任何麻烦
由于这些物体的这种可悲的双重多对多结构,我发现自己陷入了困境。现在,在有人说我应该取一个中间对象,用这个对象做一对多的运算来移除第二个对象之前,我很想这样做,但是,在这种情况下,我不能,所以我想开始讨论如何解决这个特殊问题
我试过两次不同的尝试
最大的问题是玩家的类型是NSSet,我不能只做addObject,因为NSSet是不可变的
我的第一个想法是:
func addPlayer(player: Player) {
var allPlayers = self.players.allObjects
allPlayers.append(player)
self.players = NSSet(array: allPlayers)
}
现在这在多个层面上都很糟糕。所以我马上就走
我的下一个想法是,很明显,仅仅为了添加一个项而将NSSet从一个数组中提取到一个集合中是不好的,因此我将团队的数据模型更改为
@NSManagedObject var players:Set<Player>
我真的很喜欢这个,直到我打开分析器,我的执行时间实际上变得非常糟糕
所以,我的下一个尝试是以下内容,很明显,将ManagedObject的类型保留为NSSet可以给您带来一些显著的好处,所以我不再搞砸了
func addPlayer(player: Players) {
let allPlayers = NSMutableSet(set: self.players)
allPlayers.addObject(player)
self.players = allPlayers
}
我在上次换车时遇到了一个小小的减速,但我还是不满意。还有哪些其他优化是可能的?有什么想法吗
实际上,我使用的是一个应用程序,它使用的是一个非常旧的数据库,其中包含数十万个我们无法控制重构的对象。我试图在不完全修改数据模型和破坏前端的情况下进行优化。任何有帮助的建议或想法都将不胜感激 您可以对您的NSManagedObject
实例使用mutableSetValueForKey
,以获得一个可自动更新基础集的可变集-太棒了!我刚刚发现,实际上我自己也是这样,它确实提供了一个减速带,虽然不是很大,但还是增加了速度
func addPlayer(player: Players) {
let allPlayers = NSMutableSet(set: self.players)
allPlayers.addObject(player)
self.players = allPlayers
}