ios core-data nspredicate

ios - nsfetchrequest swift 4



Predicados compuestos de iOS (1)

Estoy escribiendo una aplicación que tiene una base de datos de fotos. Cada fotografía tiene varias etiquetas asociadas y la aplicación tiene una página de búsqueda con muchos botones que permite a los usuarios buscar fotografías basadas únicamente en las etiquetas que les interesan. Cada una de estas etiquetas tiene identificadores enteros porque corresponden a los ID de una base de datos externa, por lo que estoy tratando de buscarlos simplemente por ID. Todos los campos ID están indexados.

El problema surge cuando los predicados que estoy escribiendo se vuelven bastante grandes porque el usuario puede seleccionar entre muchas etiquetas diferentes para filtrar. Esas etiquetas se agrupan en 3 categorías [publicaciones, marcas y productos], por lo que mis consultas están configuradas para ser ''OR'' dentro de una categoría y ''AND'' para todas estas categorías.

Un predicado de consulta de ejemplo termina luciendo algo como esto:

(parentPublication.publicationId==1 OR parentPublication.publicationId==2 OR parentPublication.publicationId==5) AND (ANY brands.brandId==12 OR ANY brands.brandId==2 OR ANY brands.brandId==0 OR ANY brands.brandId==3 OR ANY brands.brandId==5 OR ANY brands.brandId==6 OR ANY brands.brandId==7) AND (ANY products.productId==2 OR ANY products.productId==3 OR ANY products.productId==6)

Pueden ser mucho más grandes, pero entiendes el punto. Mi problema es que, dado que todos estos realizan uniones costosas , una vez que el usuario selecciona más de 10 o 15, las consultas son extremadamente largas e incluso pueden hacer que la aplicación se cuelgue.

Parece que sería más eficiente escribir algo como:

parentPublication.publicationId IN (1,2,5) AND (ANY brands.brandId IN (12,2,0,3,5,6,7)) AND (ANY products.productId IN (2,3,6))

Pero parece que no puedo lograr que esa sintaxis funcione.

Entonces mi pregunta es: ¿este tipo de sintaxis es compatible, y si es así, alguien me puede mostrar cómo escribirlo correctamente?

¿O existe una mejor manera de abordar este tipo de consultas contra los datos centrales todos juntos?


Usa predicados de recolección, como

[NSPredicate predicateWithFormat:@"parentPublication.publicationID in %@", pubIDs]; [NSPredicate predicateWithFormat:@"brands.brandID in %@", brandIDs]; [NSPredicate predicateWithFormat:@"product.productID in %@", productIDs];

Ahora simplemente tiene que mantener tres matrices de atributos y hacer un predicado compuesto de tres vías con andPredicateWithSubpredicates .

[NSCompoundPredicate andPredicateWithSubPredicates:@[ pubPredicate, brandPredicate, productPredicate]];

Debería funcionar bien.