Ios 在Swift核心数据中从多个关系获取对象

Ios 在Swift核心数据中从多个关系获取对象,ios,swift,core-data,one-to-many,Ios,Swift,Core Data,One To Many,围绕使用Swift在核心数据中的许多关系,我遇到了一些困难 我的数据模型 我想做的是使用国家的一个实例,然后显示该国家的所有联系人。由于我一直在尝试这样做,我构建了一个UITableViewController,它将显示该国的所有公民。然而,我遇到了一个主要问题,那就是如何将实际的联系人从与国家公民的关系中分离出来。下面是我正在使用的代码(仅相关部分) 所以,这根本不起作用。现在在for循环中,我得到一个编译器错误,它说类型“Contacts”不符合协议“Sequence Type”。我不明白

围绕使用Swift在核心数据中的许多关系,我遇到了一些困难

我的数据模型

我想做的是使用
国家的一个实例
,然后显示该国家的所有
联系人
。由于我一直在尝试这样做,我构建了一个UITableViewController,它将显示该国的所有公民。然而,我遇到了一个主要问题,那就是如何将实际的
联系人
从与
国家公民的关系中分离出来。下面是我正在使用的代码(仅相关部分)

所以,这根本不起作用。现在在for循环中,我得到一个编译器错误,它说
类型“Contacts”不符合协议“Sequence Type”
。我不明白的是这只是一种接触。。。我想这应该是一种收藏。所以,这不起作用,所以我尝试了这个

let listOfPeople = countryToShow!.citizensOfCountry as! [Contacts]
这也不起作用,我得到一个错误,
“NSArray”不是“Contacts”的子类型。
。接下来,我尝试使用NSSet进行转换

let listOfPeople = countryToShow!.citizensOfCountry as! NSSet<Contacts>

这管用!我可以打印出该国所有公民的姓名。但是我不明白为什么。当我使用
valueForKey(“name”)
但无法获得个人联系人时,为什么它会起作用?有没有更好的方法来做这件事,我只是错过了?非常感谢您对我无法从一个
国家获得
联系人的任何解释。谢谢

出现错误的原因是“多对多”关系导致了一个
NSSet
。所有迭代这些集合的尝试都应该考虑到这一点

更好的方法是实现一个
NSFetchResultsController
,这是在表视图中显示核心数据的标准方式

  • 在联邦储备委员会,找人
  • 让财务报告委员会根据您的需要进行分类
  • 给它一个谓词,用于过滤
    countryToShow
财务汇报委员会的实施:

var fetchedResultsController: NSFetchedResultsController {
    if _fetchedResultsController != nil {
        return _fetchedResultsController!
    }

    let fetchRequest = NSFetchRequest(entityName: "Contact")
    fetchRequest.sortDescriptors = [NSSortDescriptor(key: "name", ascending: true)]
    fetchRequest.predicate = NSPredicate(format:"countryOfOrigin = %@", self.countryToShow!)
    let aFetchedResultsController = NSFetchedResultsController(
       fetchRequest: fetchRequest, managedObjectContext: self.managedObjectContext!, 
       sectionNameKeyPath: nil, cacheName: nil)
    _fetchedResultsController = aFetchedResultsController

    var error: NSError? = nil
    if !_fetchedResultsController!.performFetch(&error) {
        NSLog("%@", error!)
    }

    return _fetchedResultsController!
}
var _fetchedResultsController: NSFetchedResultsController? = nil

我把Contacts改成了更合适的单数。

对不起,我实在太累了,我看不懂所有的东西。但是从我所读到的,你想得到一个国家的公民,这个国家应该是一个NSSet。要做到这一点,您只需执行以下操作:

let contacts = yourArrayOfCountries.flatMap { 
    $0.citizensOfCountry.allObjects as! [Contacts] 
}
根据你的评论:

let contacts = countryToShow!.citizensOfCountry.allObjects as! [Contacts]

那么在这个解决方案中,我会使用
citizensOfCountry
关系吗?或者我只是根据他们的
countryOfOrigin
关系过滤所有联系人?这是一样的,因为他们是反向关系。因为您使用的是
联系人
实体,所以您将使用
原产国
。我会修改我的答案,让你看看是怎么做的。只是出于我自己的好奇,如果我已经找到了
国家
,那么利用
公民与国家
的关系来找到
联系人
,不是会更有效吗?原则上是这样的。但是,您不能将“获取结果”控制器用于表视图,因为它具有所有附加的优点。对不起,我太累了,无法阅读所有内容。但是从我所读到的,你想要得到一个国家的公民,这个国家应该是一个
NSSet
。要实现这一点,您只需执行以下操作:
yourrayofcountries.flatMap{$0.citizensOfCountry.allObjects as![Contacts]}
。我将把它作为一个答案发布,以便于阅读。这可能是因为我做了一些愚蠢的事情,但我写了
let listOfPeople=countryToShow!。citizensOfCountry.flatMap{$0.citizensOfCountry.AllObject as![Contacts]}
我得到了一个错误
“Contacts”没有名为“flatMap”的成员
这是你的意思吗?你只能在数组上使用
flatMap
。您所做的是在
NSSet
上,因此它不起作用。尝试
countryToShow!。平面地图{$0.citizensOfCountry.allObjects as![Contacts]}
。我假设
countryToShow
Country
的数组。是的,这也不行
countryToShow
是一个国家对象,我正试图通过这种关系找到该国的公民。如果您介意的话,我使用您的代码得到的错误是,
'Country'没有名为'flatMap'的成员。
啊,对不起,我假设countryToShow是一个数组。我会更新答案。
让contacts=countryToShow!。citizensOfCountry.allObjects as![联系人]
应该可以工作。让我知道:)
let contacts = yourArrayOfCountries.flatMap { 
    $0.citizensOfCountry.allObjects as! [Contacts] 
}
let contacts = countryToShow!.citizensOfCountry.allObjects as! [Contacts]