2011-11-17 4 views
0

J'écris une application qui affiche certaines données qui changent selon le jour de la semaine. Le contexte de l'application est que c'est pour une conférence qui est à venir. Je veux afficher les entrées du calendrier pour ce jour. Le détail de l'événement est stocké dans coredata.iOS CoreData NSPredicate ne pas effacer

Qu'est-ce que je utilise pour créer le NSPredicate est:

NSDateFormatter *df = [[NSDateFormatter alloc] init]; 
[df setDateFormat:@"yyyy-MM-dd"]; 
NSDate *today = [NSDate date]; 
NSString *sunday = @"2011-12-04"; 
NSString *monday = @"2011-12-05"; 
NSString *tuesday = @"2011-12-06"; 
NSString *wednesday = @"2011-12-07"; 
NSInteger dayNumber = 1; 

if ([[df stringFromDate:today] isEqualToString:sunday]) { 
    dayNumber = 2; 
} else if ([[df stringFromDate:today] isEqualToString:monday]) { 
    dayNumber = 3; 
} else if ([[df stringFromDate:today] isEqualToString:tuesday]) { 
    dayNumber = 4; 
} else if ([[df stringFromDate:today] isEqualToString:wednesday]) { 
    dayNumber = 5; 
} 

NSExpression *lhs = [NSExpression expressionForKeyPath:@"day_number"]; 
NSExpression *rhs = [NSExpression expressionForConstantValue:[NSNumber numberWithInt:dayNumber]]; 

NSPredicate *equalToPredicat = [NSComparisonPredicate predicateWithLeftExpression:lhs 
                    rightExpression:rhs 
                     modifier:NSDirectPredicateModifier 
                      type:NSEqualToPredicateOperatorType 
                      options:0]; 

// Edit the sort key as appropriate. 
NSSortDescriptor *sortDescriptorTime = [[NSSortDescriptor alloc] initWithKey:@"start_time" ascending:YES]; 
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:/*sortDescriptorDayNumber,*/ sortDescriptorTime, nil]; 
[fetchRequest setSortDescriptors:sortDescriptors]; 
[fetchRequest setPredicate:equalToPredicat]; 

NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
                          managedObjectContext:managedObjectContext 
                           sectionNameKeyPath:@"day_number" 
                             cacheName:@"TodayCache"] 

Ce que je vois est bien que lorsque la date change (ex: samedi au dimanche) les données (affichées dans un UITableView) n » t être mis à jour.

Merci, Matt.

+0

Aucun du code que vous avez dans votre question touche un tableview du tout. Pourquoi voudriez-vous que la vue de table change comme par magie? – deanWombourne

Répondre

1

Le commentaire ci-dessus est correct. Quelques informations supplémentaires

1) Le tableau ne met à jour lorsque [tableView reloadData] ou l'une des autres méthodes de recharge est appelé

2) Si vous définissez un délégué pour la NSFetchedResultsController vous pouvez répondre à modéliser les changements et recharger la table

3) Le changement de date n'est pas un changement de modèle (sauf si vous mettez à jour la date dans le modèle lui-même) et NSFetchedResultsController ne se mettra à jour que s'il détecte que son contexte d'objet géré a changé.

4) Vous devez faire fetchedResultsController:performFetch:error lorsque le jour change b/c vous changez le prédicat (c'est-à-dire la requête). Sinon, la table se rechargera avec les anciennes données.

Pour actualiser la table en fonction du changement de date, vous devez détecter le changement de date à l'intervalle souhaité et recharger la table à ce moment-là. Une façon de le faire est de calculer l'intervalle entre l'heure actuelle et minuit et de régler une minuterie pour se déclencher après cet intervalle. Lorsque la minuterie se déclenche, modifiez le prédicat, effectFetch avec le contrôleur de résultats et rechargez la table. Ensuite, définissez une nouvelle minuterie jusqu'à minuit suivant. Si vous voulez que cela soit fait dans le fuseau horaire des utilisateurs, vous devrez également en tenir compte.

EDIT: clarifié réponse qu'un performFetch est nécessaire lorsque le prédicat change

+0

J'ai fait des appels à [tableView reloadData] bien que pendant que ce nom est appelé, les données ne sont pas mises à jour. –

+1

faites-vous tout ce que j'ai dit ci-dessus? Lorsque vous modifiez la requête utilisée par un récupérateur de valeur, vous devez appeler 'performFetch: ...' avant 'reloadData'. Et si vous ne changez pas la demande, vous devez le faire. La demande utilise la date actuelle au moment de sa création. Il ne suivra pas les changements de date lui-même. – XJones

+0

Ok, merci pour votre réponse informative. Vraiment couvert beaucoup de choses. En ce qui concerne le problème à résoudre, j'ai dû effacer le cache des résultats récupérés, puis mettre à jour correctement. –

Questions connexes