iphone - array - Usando NSPredicate en matrices 2D
nspredicate objective c (1)
Por lo que yo sé, no puedes hacer esto con un solo predicado. Sin embargo, puede hacerlo con un operador de clave de acceso y un predicado en dos llamadas separadas.
Entonces, tienes una matriz de matrices de términos. Desea una única matriz de términos donde su nombre contenga ''A'' (por ejemplo). Esto es lo que haces:
NSArray * allTerms = ...; //your array of arrays of terms
NSArray * collapsedTerms = [allTerms valueForKeyPath:@"@unionOfArrays.self"];
NSPredicate * filter = [NSPredicate predicateWithFormat:@"name CONTAINS[cd] %@", @"A"];
NSArray * filteredTerms = [collapsedTerms filteredArrayUsingPredicate:filter];
La magia aquí es el valor de valueForKeyPath:
bit. El operador @unionOfArrays
toma una matriz de matrices de objetos y devuelve una matriz de objetos. Esto es lo que está haciendo: El NSArray
va a romper la ruta de acceso clave .
, dándole @unionOfArrays
y self
. valueForKeyPath:
e invocará valueForKeyPath:
en sí mismo, utilizando el segundo bit (self), y obtendrá una matriz de matrices. Luego va a mezclar todos los arreglos en una sola matriz, ignorando los duplicados. (Si desea eliminar duplicados, use @distinctUnionOfArrays
en @distinctUnionOfArrays
lugar)
Una vez que tenemos esa matriz de objetos, podemos filtrarla normalmente usando un name CONTAINS ''blah''
simple name CONTAINS ''blah''
predicado name CONTAINS ''blah''
.
(Pensé que podría hacer que funcionara con SUBQUERY
, pero esa es una bestia extraña y nada fue inmediatamente obvio para mí).
Para el súper intrépido, puede hacer esto con una sola llamada a un método usando las extensiones de colección de KickingBear ( disponible aquí ), pero le recomiendo encarecidamente que no use hacks como ese en una configuración de producción. :)
Esta pregunta se basa en la misma aplicación / fuente de mi pregunta anterior que se puede encontrar aquí:
¿Cómo administrar la memoria usando clases en Objective-C?
Tengo una matriz anidada que se ve algo así cuando se imprime (solo copié y pegué una breve parte).
(
(
<Term: 0x4256420>,
<Term: 0x420fa40>,
<Term: 0x4257bd0>,
<Term: 0x4257cf0>,
<Term: 0x4257d90>,
<Term: 0x4257e30>
),
(
<Term: 0x4257e50>,
<Term: 0x4257f90>,
<Term: 0x4257fb0>,
<Term: 0x42580e0>,
<Term: 0x4258170>,
<Term: 0x4258210>,
<Term: 0x4258230>,
<Term: 0x4258360>,
<Term: 0x4258400>,
<Term: 0x42584a0>,
<Term: 0x4258540>,
<Term: 0x42585e0>,
<Term: 0x4258670>,
<Term: 0x4258710>
),
Y aquí está mi código para la parte de búsqueda de mi tabla:
- (NSInteger)tableView:(UITableView *)aTableView numberOfRowsInSection:(NSInteger)section
{
// Normal table
if (aTableView == self.tableView) return [[self.sectionArray objectAtIndex:section] count];
// Search table
//NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name contains[cd] %@", self.searchBar.text];
//self.filteredArray = [self.crayonColors filteredArrayUsingPredicate:predicate];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name contains[cd] %@", self.searchBar.text];
self.filteredArray = [[self.sectionArray objectAtIndex:section] filteredArrayUsingPredicate:predicate];
return self.filteredArray.count;
}
Recibo el error de que no puedo asignar suficiente espacio, lo que significa que debo estar haciendo algo mal, simplemente no puedo entender qué.
La parte comentada de la parte de búsqueda en el método anterior funciona, pero crayonColors es simplemente un NSMutableDictionary simple de NSStrings y no tiene matrices anidadas dentro de él.
¡Gracias por adelantado!