Ordenar resultado NSFetchedResultsController basado en array?

Me gustaría build un NSPnetworkingicate o NSSortDescriptor (búsqueda de datos básicos) que se basa en el contenido de una matriz.

La matriz consistirá en userId:s en el order correcto:

 [1, 2, 5, 3]; 

Me gustaría presentar el resultado para mi NSFetchedResultsController en el mismo order.

Así lo haré:

  1. Obtén los usuarios correctos (he hecho esto)
  2. Ordene la list de usuarios según mi matriz orderada con userId s.

¿Esto es posible y cómo puedo hacerlo?

Creo que eso no es posible. La sorting de los resultados de una request de búsqueda (para un almacén basado en SQLite) se realiza en el nivel SQLite y puede usar solo los attributes persistentes almacenados en la database. El descriptor de sorting no puede usar funciones o variables de Objective-C.

O bien

  • agrega un atributo adicional a su entidad que describe el pedido previsto (si es posible), o
  • ordera los resultados de acuerdo con sus necesidades después de searchlos (lo que significa que ya no puede usar un controller de resultados desencryption para el seguimiento automático de cambios). Quizás pueda usar el método descrito aquí: https://stackoverflow.com/a/15618277/1187415 .

La respuesta anterior no es exactamente cierta. Puedes hacer lo que quieras, pero es un poco complicado.

  1. Cree una categoría en NSNumber (ID de usuario es un número, ¿verdad?)
  2. Ponga una variable global de tipo NSArray en categoría usando objc_setAssoc …

     @interface NSNumber(MyExtension) + (NSArray *) orderingArray; + (void) setOrderingArray: (NSArray *)array; - (NSComparisonResult) myOwnCompareMethodUsingArray:(NSNumber *)theOtherNumber; @end int keyVar = 0; @implementation NSNumber(MyExtension) + (NSArray *) orderingArray { return objc_getAssociatedObject(self, &keyVal); } + (void) setOrderingArray: (NSArray *)array { objc_setAssociatedObject(self, &keyVal, array, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } - (NSComparisonResult) myOwnCompareMethodUsingArray:(NSNumber *)theOtherNumber; { NSArray *a = [self.class orderingArray]; if(!a) return NSOrdenetworkingSame; return [@([a indexOfObject:self]) compare: @([a indexOfObject:theOtherNumber])]; } 
  3. Establezca la matriz en alguna parte:

     [NSNumber setOrderingArray:myArrayWithKeys]; 
  4. Utilice el tipo de descriptor de tipo:

     [NSSortDescriptor sortDescriptorWithKey:@"userId" ascending:YES selector @selector(myOwnCompareMethodUsingArray:)] 

Al parecer, esto funcionará como funciona para las cadenas con localizedCaseInsensitiveCompare: Sin embargo, degradará el performance de la consulta si es lo suficientemente grande y anulará cualquier optimization fetchLimit / fetchOffset. Recuerde que el campo en el que está operando tiene que ser único, de lo contrario todo irá al infierno.