【问题标题】:NSPredicate check for kind of object class in swiftNSPredicate 快速检查对象类的种类
【发布时间】:2023-03-30 19:10:01
【问题描述】:

我有以下核心数据模型:

现在我想获取所有类型为 CDOnlineContact 和 CDOfflineContact 的对象。所以我有以下 fetchedController:

let fetchRequest = NSFetchRequest(entityName: "CDContact")
    fetchRequest.predicate = NSPredicate(format: "??? %@", CDOnlineContact, CDOfflineContact) // <-- Here find only the object of class CDOnlineContact and CDOfflineContact 
    fetchRequest.sortDescriptors = [NSSortDescriptor(key: "fullname", ascending: true)]
    let controller = NSFetchedResultsController(fetchRequest: fetchRequest,
        managedObjectContext: self.context.managedObjectContext!,
        sectionNameKeyPath: "firstLetter",
        cacheName: nil)
    controller.performFetch(nil)

我在objective-c中找到了一些解决方案...

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"self isKindOfClass: %@", [NSNumber class]];

,但不幸的是,我无法像这样快速检查课程。 仅使用查询:

mySecretObject is CDOnlineContact

在 NSPredicate 中我不能这样做。所以我不知道只找到具有指定类的对象。

【问题讨论】:

  • 可能更好的方法是在 CDProfile 实体上创建一个新属性,如 onlineOfflineContact,当 CDOnlineContact 或 CDOfflineContact 在 willSave 方法中保存时,您可以将此布尔值设置为 yes,默认情况下为 NO。这样你就可以使用像“onlineOfflineContact = 'YES'”这样的简单谓词来获取联系人
  • @GeneratorOfOne 谢谢,如果无法查询类,那么您的解决方案是个好主意。另一种解决方案是,如果类的名称存储在属性中。

标签: ios swift core-data


【解决方案1】:

您可以像这样使用NSPredicateblock

let predicate = NSPredicate { (evaluatedObject, _) in
    return evaluatedObject is NSNumber
    // or
    // return evaluatedObject.isKindOfClass(NSNumber)
}

let predicate = NSPredicate(format: "SELF isKindOfClass:%@", argumentArray: [NSNumber.self])

【讨论】:

  • 不幸的是它不起作用,我得到以下异常:Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Problem with subpredicate BLOCKPREDICATE(0x7f89a1f42210)
  • 好的,似乎不能将块谓词与 CoreData 一起使用。 isKindOfClass 也可以使用 Swift。
  • 抛出同样的异常。
  • @Qeychon 在尝试了一些方法之后,我建议您将 type 属性保存为实体上的枚举。它可能更容易过滤。
  • 是的,我也认为这是最简单的解决方案。谢谢。
猜你喜欢
  • 1970-01-01
  • 2016-12-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-10
  • 1970-01-01
  • 2023-03-15
  • 2020-08-20
  • 1970-01-01
相关资源
最近更新 更多