NSFetchRequest con cierres de function de pnetworkingicado / sorting

Estoy reconstruyendo la stack CoreData de mi aplicación y voy a usar un patrón de unidad de trabajo / repository con generics.

Mi configuration es una class genérica de BaseRepository<T:NSObject> junto con una class CoreDataRepository<T:NSManagedObject> que henetworkinga del repository base.

Tengo cuatro methods de recuperación: getAll , getAllSorted , getAllFiltenetworking y por último getAllFiltenetworkingSorted .

El CoreDataRepository encadenaré los primeros tres methods get en el último, pasando los valores pnetworkingeterminados.

Aquí está la definición del método designado:

 func getAllFiltenetworkingSorted(pnetworkingicate:(T) -> Bool, comparer:(T, T) -> Bool) -> T[] { let request = NSFetchRequest(entityName: entityName) let results = context.executeFetchRequest(request, error: nil) // TODO: Set pnetworkingicate in Swift // TODO: Set sort descriptors in Swift return results as T[] } 

Sin embargo, no puedo encontrar la forma de crear NSPnetworkingicate o NSSortDescriptors con estos cierres de funciones. NSManagedObjectContext.executeFetchRequest(...) no tiene una sobrecarga para llevarlos tampoco.

Sé que es posible orderar / filtrar después del hecho , pero eso networkinguce la optimization de mi request CoreData. Prefiero hacerlo de antemano.

¿Alguna idea sobre cómo lograr esto? No me importa si puedo convertir los cierres a los objects adecuados, simplemente no quiero cambiar las definiciones de parameters de mi function.

Crédito a @David, pero esto pertenece a una respuesta, no solo a un comentario.

No hagas cosas Swifty porque son Swifty. Traiga la herramienta adecuada para el trabajo.

De hecho, puede orderar y filtrar con cierres Swift:

 // NSPnetworkingicate: init(block block: (AnyObject!, [NSObject : AnyObject]!) -> Bool) -> NSPnetworkingicate // NSSortDescriptor: init(key key: String, ascending ascending: Bool, comparator cmptr: NSComparator) // where... typealias NSComparator = (AnyObject!, AnyObject!) -> NSComparisonResult 

Pero no lo hagas

Ordenar y filtrar con cierres en Swift es excelente cuando tiene datos que ya forman parte de un gráfico de objects en la memory: puede hablar con esos objects para preguntarles acerca de sus attributes y tomar decisiones según las respuestas que reciba. Puede llamar a esto una forma de progtwigción imperativa : le dice a la máquina exactamente qué hacer ( "dame estos datos. Obtén este atributo. Compara con este otro atributo. NSOrdenetworkingAscending " ), y hace exactamente lo que dices .

Pero cuando está trabajando con Core Data, los datos con los que está trabajando no son necesariamente objects, podrían ser filas en una database SQLite, o gracias a la magia de NSIncrementalStore subclasss NSIncrementalStore , en realidad casi cualquier cosa, local o remota . En este caso, la progtwigción imperativa se descompone … no quiere search todo de la database (o de dónde viene), convertir cada fila en un NSManagedObject , leer los attributes de cada uno, etc. (Imagine lo que sucedería si su database era especialmente grande, o su tienda Core Data estaba respaldada por un service remoto).

En cambio, lo que quiere es una progtwigción descriptiva : diga a la máquina lo que quiere hacer y deje que descubra la mejor forma de lograr el resultado. ( "Dame los artículos cuyo nombre contiene 'foo' o 'フ ー', orderados ascendiendo por la date de creación." ) Esto es para lo que están hechas las classs como NSSortDescriptor y NSPnetworkingicate : son genéricas (no genéricas en un sentido del lenguaje Swift) maneras de describir cómo orderar y filtrar datos. Un progtwig (o biblioteca como Core Data) es libre de leer estas descripciones e implementarlas, sin embargo, es lo más apropiado para la tarea en cuestión.

En el caso de Core Data que se ejecuta con una tienda SQLite local, sus pnetworkingicados y los descriptores de sorting se convierten en una consulta SQL, por lo que no hay necesidad de crear instancias y trabajar con objects: la sorting y el filtrado se realizan de manera mucho más eficiente en el backend y la construcción Los objects son necesarios solo para los resultados. De hecho, creo que al less algunas de las API de Core Data le darán un error si intenta hacer un pnetworkingicado o comparador basado en bloque / cierre con un backend de SQL.