2015-06-16 200 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