2014-06-06 2 views
0

J'ai un problème intermittent. Je supprime l'application du simulateur et lance Xcode. L'application est lancée pour la première fois. RESTKit télécharge 7 objets à partir du serveur (connectez-vous ci-dessous). Cependant, NSFetchedResultsController montre les sections comptent == 0 et le tableview est videRESTKit: NSFetchResultsController ne se met pas à jour lors du premier lancement

2014-06-06 07:14:22.541 App[4859:60b] I restkit.network:RKObjectRequestOperation.m:180 GET 'http://www.domain.com/meetings?lastrequest=2004-06-06T07%3A00%3A00Z' 
2014-06-06 07:14:22.772 App[4859:7b03] I restkit.network:RKObjectRequestOperation.m:250 GET 'http://www.domain.com/meetings?lastrequest=2004-06-06T07%3A00%3A00Z' (200 OK/7 objects) [request=0.1917s mapping=0.1528s total=0.2559s] 

Quand j'arrête l'application et de le relancer, je reçois 3 sections et 7 cellules dans le tableView. C'est comme si le NSFetchedResultsController n'était pas mis à jour la première fois. Aléatoirement, l'application charge les données la première fois.

ci-dessous est ma configuration FRC:

- (NSFetchedResultsController *)fetchedResultsController 
{ 
    if(_fetchedResultsController!=nil) 
    { 
     return _fetchedResultsController; 
    } 

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Meetings" 
               inManagedObjectContext:self.managedObjectContext]; 
    [fetchRequest setEntity:entity]; 

    NSSortDescriptor *firstSort = [[NSSortDescriptor alloc] initWithKey:@"startDate" 
                   ascending:NO]; 

    NSArray *sortDescriptors = [[NSArray alloc]initWithObjects:firstSort,nil];  
    [fetchRequest setSortDescriptors:sortDescriptors]; 


    self.fetchedResultsController = [[NSFetchedResultsController alloc]initWithFetchRequest:fetchRequest 
                     managedObjectContext:self.managedObjectContext 
                     sectionNameKeyPath:@"sectionIdentifier" 
                        cacheName:nil]; 
    self.fetchedResultsController.delegate = self; 
    return self.fetchedResultsController; 
} 

CEAF délégués:

#pragma mark - NSFetchedControllerDelegate 

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller 
{ 
     [self.tableView beginUpdates]; 
} 

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller 
{ 
     [self.tableView reloadData]; 
     [self.tableView endUpdates]; 
} 

- (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: 
     { 
      Invite *changedInvite = [self.currentFRC objectAtIndexPath:indexPath]; 
      STInviteSummaryCell *cell = (STInviteSummaryCell *)[self.tableView cellForRowAtIndexPath:indexPath]; 
      [cell updateValuesForChangedInvite:changedInvite]; 
     } 
      break; 
     case NSFetchedResultsChangeMove: 
     { 
      [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
      [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade]; 
     } 
      break; 
    } 
} 

- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id<NSFetchedResultsSectionInfo>)sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type 
{ 
    switch (type) { 
     case NSFetchedResultsChangeInsert: 
      [self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade]; 
      break; 
     case NSFetchedResultsChangeDelete: 
      [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade]; 
      break; 
    } 
} 

RESTKit Fetch:

RKManagedObjectRequestOperation *operation = [[RKManagedObjectRequestOperation alloc]initWithRequest:request responseDescriptors:@[responseDescriptor]]; 
operation.managedObjectContext = self.objectManager.managedObjectStore.mainQueueManagedObjectContext; 
operation.managedObjectCache = appDelegate.managedObjectStore.managedObjectCache; 
operation.savesToPersistentStore = NO; 

[operation setCompletionBlockWithSuccess:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) { 

    //Before saving the objects, here I iterate through the each object in the array and flag each attribute that's changed in the object. 

    NSError *error; 
    if ([self.managedObjectContext saveToPersistentStore:&error]) 
    { 
     NSLog (@"******* OBJECTS SAVED **********"); 
    } 

} failure:^(RKObjectRequestOperation *operation, NSError *error) { 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     [SVProgressHUD dismiss]; 
     [self updateUI]; 
    }); 

}]; 

[operation start]; 
[operation waitUntilFinished]; 

}

Encore une fois la question est intermittente.

EDIT

Dans la même classe, j'ai le code suivant:

- (void)loadView 
{ 
    [self getManagedObjectFromAppDelegate]; 
    [self registerForReachibilityNotificaiton]; 
    [self fetchInvitesInBackgroundThread]; 

    [super loadView]; 
} 


- (void)getManagedObjectFromAppDelegate 
{ 
    STAppDelegate *appDelegate = (STAppDelegate *)[[UIApplication sharedApplication] delegate]; 

    [appDelegate setupCoreDataWithRESTKit]; 
    self.objectManager = [self getObjectManager]; 

    self.objectManager.managedObjectStore = appDelegate.managedObjectStore; 
    self.objectManager.managedObjectStore.managedObjectCache = appDelegate.managedObjectStore.managedObjectCache; 
    self.managedObjectContext = [RKManagedObjectStore defaultStore].mainQueueManagedObjectContext; 
} 
+0

Qu'est-ce que 'self.managedObjectContext', comment cela se rapporte-t-il à' self.objectManager.managedObjectStore.mainQueueManagedObjectContext'? – Wain

+0

A fait une modification. Dois-je aussi faire 'self.managedObjectContext = self.objectManager.managedObjectStore.mainQueueManagedObjectContext;' in '- (NSFetchedResultsController *) fetchedResultsController' – user1107173

+0

Je ne sais pas - vous ne m'avez pas dit ce qu'ils étaient. Utilisez probablement le 'mainQueueManagedObjectContext' oui. – Wain

Répondre

1

Il semble tout comme les contextes d'objets gérés ne sont pas correctement liés, de sorte que vous pouvez utiliser mainQueueManagedObjectContext pour tout de sorte qu'ils sont. Il est possible de créer un autre contexte enfant pour exécuter l'opération, mais jusqu'à ce que le profilage montre que vous avez un problème de performances, vous n'avez pas besoin d'ajouter cette complexité.

Questions connexes