Suministro de datos básicos de UITableView a la antigua usanza

¿Alguien tiene un ejemplo de cómo eficiente. proporcionar una UITableView con datos de un modelo Core Data, preferiblemente incluyendo el uso de secciones (a través de una propiedad referenciada), sin el uso de NSFetchedResultsController?

¿Cómo se hizo esto antes de que NSFetchedResultsController estuviera disponible? Idealmente, la muestra solo debe obtener los datos que se están viendo y hacer solicitudes adicionales cuando sea necesario.

Gracias,

Tim

preguntado el 12 de junio de 12 a las 16:06

me atrevo a preguntar el porqué ¿Desea evitar el uso de NSFetchedResultsController? Deduciría de su cursiva de "eficientemente" que siente que NSFetchedResultsController parece ineficiente de alguna manera. ¿Por favor explique? -

Me gustaría ver un ejemplo que sea eficiente de la misma manera que lo es NSFetchedResultsController (es decir, solo obtener las filas que se necesitan), sin embargo, no puedo usar NSFetchedResultsController porque necesito modificar los resultados insertando filas adicionales que no tienen nada. que ver con el modelo de datos... -

Bueno, podría copiar la matriz de resultados obtenidos en un NSMutableArray y luego insertar sus valores falsos donde los necesite, ¿no es así? -

1 Respuestas

Para que conste, estoy de acuerdo con CommaToast en que, en el mejor de los casos, hay un conjunto muy limitado de razones para implementar una versión alternativa de NSFetchedResultsController. De hecho, no puedo pensar en una ocasión en la que recomendaría hacerlo.

Dicho esto, a los efectos de la educación, me imagino que:

  • sobre la creación, NSFetchedResultsController ejecuta lo pertinente NSFetchRequest contra el contexto del objeto gestionado para crear el conjunto de resultados inicial;
  • posteriormente, si tiene un delegado, escucha NSManagedObjectContextObjectsDidChangeNotification del contexto del objeto gestionado. Al recibir esa notificación, actualiza su conjunto de resultados.

Las solicitudes de recuperación se ubican sobre predicados y los predicados no siempre se pueden desglosar en las claves a las que hacen referencia (por ejemplo, si crea uno a través de predicateWithBlock:). Además, aunque las listas insertadas y eliminadas son bastante explícitas, la lista de objetos cambiados no proporciona pistas sobre cómo han cambiado esos objetos. Así que me imagino que simplemente vuelve a ejecutar el predicado proporcionado en la solicitud de búsqueda contra el conjunto combinado de registros modificados e insertados, luego acumula los resultados de manera adecuada, eliminando cualquier cosa del conjunto eliminado que previamente consideró un resultado.

Probablemente hay cosas más eficientes que podría hacer cuando se trata de una solicitud de recuperación con un límite de recuperación. Observaciones obvias, directamente desde la parte superior de mi cabeza:

  • si ya tenía suficientes objetos, ninguno de ellos se eliminó o modificó y ninguno de los objetos recién insertados o modificados tiene una posición de clasificación más alta que los objetos que tenía, entonces obviamente no hay cambios para propagar y no necesita ejecutar una nueva consulta;
  • incluso si ha perdido algunos de los objetos que tenía, si mantuvo el que estaba más bajo, entonces tiene un límite superior para todo lo que no cambió, por lo que si cambió e insertó los que ya tenía, haga más entonces suficiente, entonces también puede evitar una nueva consulta.

La extensión lógica parece ser que necesita volver a interrogar el contexto del objeto administrado solo si se encuentra en una posición en la que las eliminaciones, inserciones y cambios modifican su lista ordenada de modo que, antes de reducirla al límite de búsqueda dado, el objeto inferior no es uno que tenías la última vez. El razonamiento es que aún no sabe nada sobre los objetos almacenados que no tiene en comparación con las inserciones y modificaciones; solo sabes cómo se comparan los que no tienes con los que tenías antes.

Respondido 20 Jul 12, 03:07

Hola. Gracias por responder, te mereces una marca por eso :) Específicamente, el problema que tuve fue la necesidad de admitir la sección vacía; algo que NSFetchedResultsController simplemente no puede hacer. Desde entonces, escribí mi propia subclase para parchear esta función: TAFetchedRestultsController en GitHub si está interesado. - tarmes

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.