2015-06-16 146 views
1

检查类型的对象类的我有以下核心数据模型:NSPredicate在迅速

enter image description here

现在我想提取类型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我不能做到这一点。所以我没有任何想法只找到具有指定类的对象。

+0

可能是更好的办法是创建像onlineOfflineContact上CDProfile实体的新属性,当CDOnlineContact或CDOfflineContact保存willSave方法,你可以将这个布尔值设置为yes,默认为NO。这样你可以使用简单的谓词来获取联系人,如“onlineOfflineContact ='YES'” – Sandeep

+0

@GeneratorOfOne谢谢,如果无法查询类,那么你的解决方案是一个好主意。另一种解决方案是如果类的名称存储在属性中。 – Qeychon

回答

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]) 
+0

不幸的是,它不起作用,我得到以下异常:'由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:'问题与subpredicate BLOCKPREDICATE(0x7f89a1f42210)' – Qeychon

+0

好吧,似乎不能用CoreData的块谓词。 'isKindOfClass'也可以用于Swift。 – Bannings

+0

让我知道如果这个作品 – Bannings