6

Where to find the documentation of the SUBQUERY feature of NSPredicate for Core Data?

dontWatchMyProfile
  • 45,440
  • 50
  • 177
  • 260

1 Answers1

8

Good question... it seems like this isn't well documented.

Here is what I found:

Update:

With the addition of App Extensions, Apple has included more SUBQUERY examples since they are required for complex matching logic.

  • In the String Comparisons section of the Predicate Programming Guide, it now includes an example of how to match a UTI:

     SUBQUERY (
         extensionItems,
         $extensionItem,
         SUBQUERY (
             $extensionItem.attachments,
             $attachment,
             ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "com.adobe.pdf"
         ).@count == $extensionItem.attachments.@count
     ).@count == 1
    
  • You can find a more complex example in the App Extension Programming Guide > App Extension Essentials > Handling Common Scenarios section:

     SUBQUERY (
         extensionItems,
         $extensionItem,
         SUBQUERY (
             $extensionItem.attachments,
             $attachment,
             ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "org.appextension.action-one" ||
             ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "org.appextension.action-two"
         ).@count == $extensionItem.attachments.@count
     ).@count == 1
    
  • There's also an NSPredicate Cheatsheet which discusses SUBQUERY in addition to several other NSPredicate features.


Essentially each SUBQUERY is equivalent to filter in Swift. And ANY is equivalent to contains.

So taking this example again:

SUBQUERY (
    extensionItems,
    $extensionItem,
    SUBQUERY (
        $extensionItem.attachments,
        $attachment,
        ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "com.adobe.pdf"
    ).@count == $extensionItem.attachments.@count
).@count == 1

It would be similar to this in Swift:

extensionItems.filter {
  $0.attachments.filter {
    $0.registeredTypeIdentifiers.contains {
      $0.utiConformsTo("com.adobe.pdf")
    }
  }.count == $0.attachments.count
}.count == 1
Guillaume Algis
  • 10,705
  • 6
  • 44
  • 72
Senseful
  • 86,719
  • 67
  • 308
  • 465
  • Indeed it seems that this feature is entirely undocumented. What a pitty - seems to be so cool. I can only guess: They fear that people over-use this, since it seems to be something reall, really heavy. – dontWatchMyProfile Jun 19 '10 at 19:27
  • 1
    Or not enough people have filed a radar with apple to make it important enough to document. If you want to see documentation on this feature, file a radar. – Marcus S. Zarra Jun 22 '10 at 16:06