Le problème ici est que NSDate ne dispose pas d'un day
(ou tout autre similaire) propriété. Si c'est le cas, votre prédicat fonctionnerait comme écrit.
La programmation des données et de l'heure est complexe sous le capot. Par exemple, dans l'usage courant, l'expression "même date" signifie le même jour calendrier. Cependant, du point de vue des codes, cela signifie également la même semaine, le même mois et l'année, car les jours ne sont pas plus significatifs pour le code que toute autre division arbitraire du calendrier. Même dans un usage ordinaire, "jour" peut se référer à une plage spécifique d'heures, par ex. Samedi, 21 août 2010 ou il peut se référer à toute plage arbitraire de 24 heures comme dans "un jour". Lequel avez-vous besoin pour cette application?
NSDate est vraiment une enveloppe d'objet autour d'un horodatage précis de microseconde. Il dispose de méthodes de conversion en chaînes et de création et de comparaison d'horodatages, mais ne comprend pas les attributs de calendrier tels que les secondes, minutes, heures, jours, semaines, mois ou années. C'est ce à quoi sert NSCalendar et les données de base ne supportent pas intrinsèquement cette classe en tant que type de données, car cela serait complexe pour tous les calendriers possibles.
Si les attributs de calendrier sont nécessaires dans un modèle, vous devez créer une entité personnalisée qui modélise une date de calendrier. Définissez les attributs d'entité sur les attributs de calendrier dont vous avez besoin pour modéliser, puis une relation avec l'objet qui a besoin de la date du calendrier en tant que propriété, par exemple.
CalendarDate{
date:NSDate
minute:int
hour:int
day:int
month:int
year:int
events<--(required,nullify)-->>Event.date
}
Vous pouvez créer une classe personnalisée pour l'entité et de fournir une méthode qui renseigne automatiquement l'objet en fonction du passé NSDate et un calendrier que vous choisissez.
Maintenant, votre prédicat est facile.
NSPredicate *myPred;
myPred=[NSPredicate predicateWithFormat:@"(date.date==%@ or date.day==%i) AND repeat=%i", currentDate, 45, kMonthly];
Cela semble être gênant, mais il est nécessaire en raison de la véritable complexité des dates du calendrier. Il n'existe tout simplement pas un moyen facile de gérer les calculs de date et d'heure et les comparaisons pour tous les usages.
Merci pour votre réponse. Je cherchais le meilleur moyen de le faire et me demandais si c'était possible avec un "simple" nspredicate. – Manhuman