2010-08-29 16 views
9

Mi vista de tabla muestra una lista de usuarios. Estoy teniendo problemas para actualizar mi vista de tabla después de agregar un usuario. Probé diferentes combinaciones de códigos y eventos y ahora la aplicación se bloquea en la llamada a endUpdates. La aplicación se basa en el modelo de la aplicación de recetas, por lo que un usuario hace clic en el botón Agregar y luego aparece una ventana modal que solicita el nombre de los usuarios. Luego va a la pantalla de edición y luego a la lista de usuarios. En ese momento, el nuevo usuario no aparecía. Pero si navegaba de regreso a la pantalla principal, y luego regresaba a la pantalla de los usuarios, el usuario aparecía.Aplicación para iPhone que se bloquea en [self.tableView endUpdates]

He aquí algunos de mi código:

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller { 
    sectionInsertCount = 0; 
    [self.tableView beginUpdates]; 
} 
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller { 
    [self.tableView endUpdates]; 

} 

    - (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type { 
switch(type) { 

    case NSFetchedResultsChangeInsert: 
      if (!((sectionIndex == 0) && ([self.tableView numberOfSections] == 1))) { 
       [self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade]; 
       sectionInsertCount++; 
      } 

    break; 
    case NSFetchedResultsChangeDelete: 
      if (!((sectionIndex == 0) && ([self.tableView numberOfSections] == 1))) { 
       [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade]; 
       sectionInsertCount--; 
      } 

    break; 
     case NSFetchedResultsChangeMove: 
      break; 
     case NSFetchedResultsChangeUpdate: 
      break; 
     default: 
      break; 
} 
} 

    - (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath { 
switch(type) { 
    case NSFetchedResultsChangeInsert: 
      [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade]; 
    break; 
    case NSFetchedResultsChangeDelete: 
    [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
    break; 
     case NSFetchedResultsChangeUpdate: { 
      [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
     } 
    case NSFetchedResultsChangeMove: 
      if (newIndexPath != nil) { 

       NSUInteger tableSectionCount = [self.tableView numberOfSections]; 
       NSUInteger frcSectionCount = [[controller sections] count]; 
       if (frcSectionCount != tableSectionCount + sectionInsertCount) { 
        [self.tableView insertSections:[NSIndexSet indexSetWithIndex:[newIndexPath section]] withRowAnimation:UITableViewRowAnimationNone]; 
        sectionInsertCount++; 
       } 


       [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
       [self.tableView insertRowsAtIndexPaths: [NSArray arrayWithObject:newIndexPath] 
            withRowAnimation: UITableViewRowAnimationRight]; 

    runEndUpdates = NO; 

      } 
      else { 
       [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:[indexPath section]] withRowAnimation:UITableViewRowAnimationFade]; 
      } 
    break; 
     default: 
    break; 
} 
} 

ya casi estoy en un punto de ruptura con esto. CoreData ha sido la parte más frustrante del desarrollo de aplicaciones. ¿Debería cambiar a SQL Lite? ¿O seguiré teniendo los mismos problemas?

Gracias!

Respuesta

2

Hoy tuve el mismo problema.

El problema estaba en mi código fuente: una de las funciones UITableViewDataSource utilizaba un objeto no válido (no un objeto CoreData, una matriz simple, que olvidé retener), esto causó un bloqueo. Desafortunadamente, esto no estaba claro desde la pila de llamadas, no se proporcionó ningún mensaje en la consola.

Por lo tanto, la razón podría estar en su implementación del protocolo UITableViewDataSource.

+0

Pero si usas fetchedResultsController (como el autor lo hizo) - es muy difícil cometer un error aquí :) Número de secciones: return [self.fetchedResultsController.sections count]; Número de rowsInSection: return [self.fetchedResultsController.sections [section] numberOfObjects]; – Miroslav

-3

Intente llamar al [self.tableview reloaddata] dentro de controllerDidChangeContent.

+6

que elimina todo el propósito de animar los cambios de filas. – samvermette

+0

"No debe llamar a reloadData dentro del grupo; si llama a este método dentro del grupo, tendrá que realizar cualquier animación usted mismo". - De la documentación de Apple: https://developer.apple.com/library/ios/documentation/uikit/reference/UITableView_Class/Reference/Reference.html#//apple_ref/occ/instm/UITableView/beginUpdates – Fabio

5

En mi experiencia, debe tener algunas filas o secciones insertadas o eliminadas entre beginUpdated y endUpdated. Si no hay filas o secciones insertadas o eliminadas entre beginUpdated y endUpdated, se bloqueará.

Y, si el número de sección y el número de fila no son correctos, se bloqueará también. Por lo tanto, necesita una codificación muy cuidadosa.

+0

Esto solucionó el problema I tenido. Estaba filtrando filas con UISearchBar y NSFetchedResultsController. El usuario seleccionaría la fila activando un evento guardar en didSelectRowAtIndexPath. Al crear un indicador y establecerlo en NO, se detuvo UITableView beginUpdates y endUpdates y se resolvió el problema. Gracias Toro – RobCroll

2

Estaba viendo un bloqueo en el mismo lugar, pero por un motivo diferente. También vería este extraño comportamiento donde el desplazamiento de la vista de tabla se ralentizaría y básicamente dejaría de responder. La razón detrás de esto terminó siendo algo prolijo e interesante, así que pensé que lo compartiría.

Mi vista de tabla tiene varios eventos ordenados por fecha. Los eventos se consultan desde una API web 50 a la vez. Cada vez que se realiza una nueva consulta, la actualización de los resultados obtenidos y las nuevas celdas se animan. Al principio noté muchos cambios extraños cuando se agregaban nuevas filas, pero parecía algo para optimizar más adelante.

Se pueden guardar eventos en la aplicación y la vista de tabla tiene una forma de filtrar entre todos los eventos y eventos guardados. Una vez estaba tocando el filtro para alternar entre todos los eventos y los eventos guardados, y noté que dentro de un día en particular cuando volvía a la vista de todos los eventos, se reorganizaban.

Oh duh, también necesito un descriptor para la hora de inicio. Eso es algo que hará que la aplicación sea más agradable de usar.

OH DUH! ¡Apuesto a que esta es la razón por la que también se está estrellando! Dado que cada actualización básicamente causaba que cada fila existente se moviera a un nuevo lugar, además de agregar filas adicionales, debo haber estado golpeando alguna falla de bloqueo en el controlador de vista de tabla. Ahora los problemas de desplazamiento se han ido, y el accidente también se ha ido.

Lección aprendida: Asegúrese de que el controlador de resultados obtenido tenga suficientes descripciones de clasificación para que los resultados sean determinantes en las recargas de la vista.

Cuestiones relacionadas