2013-04-13 6 views
1

J'ai NSPredicate avec quatre instructions/paramètres. Il semble que tous ne sont pas "inclus". Il ressemble à ceci:NSPredicate avec plusieurs instructions

predicate = [NSPredicate predicateWithFormat:@"user.youFollow = 1 || user.userId = %@ && user.youMuted = 0 && postId >= %d", [AppController sharedAppController].currentUser.userId, self.currentMinId.integerValue]; 

Il semble que la dernière partie: && postId >= %d, est ignoré. Si j'essaie:

predicate = [NSPredicate predicateWithFormat:@"user.youFollow = 1 || user.userId = %@ && user.youMuted = 0 && postId = 0", [AppController sharedAppController].currentUser.userId, self.currentMinId.integerValue]; 

J'obtiens le même résultat (devrait être 0). Je me demande comment un prédicat comme celui-ci devrait ressembler?

+0

Avez-vous essayé avec parenthèses? Juste pour voir si c'est un problème de précédence ... – Francesco

+0

J'ai essayé: '(user.youFollow = 1 || user.userId =% @) && (user.youMuted = 0 && postId> =% d)'. – Anders

+0

Que fait NSLog (@ "% @", [description du prédicat]); 'imprimer? –

Répondre

3

Comme il est apparu dans la discussion, le vrai problème est que le prédicat est utilisé dans un contrôleur tiré par les cheveux de résultats, et que les variables utilisées dans le changement prédicat au fil du temps.

Dans ce cas, vous devez recréer le prédicat et la requête d'extraction. Cela est documenté dans "Modification de la demande d'extraction" dans le NSFetchedResultsController Class Reference.

Donc, dans votre cas, si self.currentMinId changements, vous devez

// create a new predicate with the updated variables: 
NSPredicate *predicate = [NSPredicate predicateWithFormat:...] 
// create a new fetch request: 
NSFetchRequest *fetchRequest = ... 
[fetchRequest setPredicate:predicate]; 

// Delete the section cache if you use one (better don't use one!) 
[self.fetchedResultsController deleteCacheWithName:...]; 

// Assign the new fetch request and re-fetch the data: 
self.fetchedResultsController.fetchRequest = fetchRequest; 
[self.fetchedResultsController performFetch:&error]; 

// Reload the table view: 
[self.tableView reloadData]; 
+0

Merci, il faut que ça marche! Petite note, setFetchRequest est en lecture seule. J'ai fait: 'self.fetchedResultsController.fetchRequest setPredicate ...'. – Anders

+0

@Anders: Merci pour vos commentaires! 'self.fetchedResultsController.fetchRequest setPredicate: newPredicate]' pourrait aussi fonctionner, peut-être que vous voulez essayer cela. Dans ce cas, vous n'avez besoin que d'un nouveau prédicat, mais pas d'une nouvelle requête d'extraction. –

3

Pouvez-vous essayer le code suivant?

NSPredicate *youFollowPred = [NSPredicate predicateWithFormat:@"user.youFollow == 1"]; 
NSPredicate *userIdPred = [NSPredicate predicateWithFormat:@"user.userId == %@",[AppController sharedAppController].currentUser.userId]; 
NSPredicate *youMutedPred = [NSPredicate predicateWithFormat:@"user.youMuted == 0"]; 
NSPredicate *postIdPred = [NSPredicate predicateWithFormat:@"postId >= %d", self.currentMinId.integerValue]; 

NSPredicate *orPred = [NSCompoundPredicate orPredicateWithSubpredicates:[NSArray arrayWithObjects:youFollowPred,userIdPred, nil]]; 

NSPredicate *andPred = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects:youMutedPred,postIdPred, nil]]; 

NSPredicate *finalPred = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects:orPred,andPred, nil]]; 
+0

Merci, cela fonctionne. Savez-vous si - 'NSPredicate * postIdPred = [NSPredicate predicateWithFormat: @" postId> =% d ", self.currentMinId.integerValue]; - peut avoir une variable dynamique '% d'. Besoin de mettre à jour mon prédicat avant de faire de nouvelles recherches. – Anders

+1

@sunilz: Notez que votre code est exactement équivalent au prédicat '" (user.youFollow = 1 || user.userId =% @) && (user.youMuted = 0 && postId> =% d) ", ... '. –

Questions connexes