Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/100.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 将对象插入NSSet';s在Swift中具有多对多关系_Ios_Swift_Many To Many_Nsset - Fatal编程技术网

Ios 将对象插入NSSet';s在Swift中具有多对多关系

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

假设我有一个带有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
}
每个队都有一组队员。 每个球员都有一组他们效力的球队

所以本质上,我有两个多对多的关系。如果只有一个,我就可以使用反转将对象插入到它的集合中,而不会有任何麻烦

由于这些物体的这种可悲的双重多对多结构,我发现自己陷入了困境。现在,在有人说我应该取一个中间对象,用这个对象做一对多的运算来移除第二个对象之前,我很想这样做,但是,在这种情况下,我不能,所以我想开始讨论如何解决这个特殊问题

我试过两次不同的尝试

最大的问题是玩家的类型是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
}