这是一个根据当前时间过滤具有开始时间和结束时间的数组的示例。这很好用:
问题:但是在这里我想知道collectionArr的索引位置,其中谓词选择值。
NSDate* currentDate = [NSDate date];
NSDateFormatter *_formatter = [[[NSDateFormatter alloc] init] autorelease];
[_formatter setLocale:[NSLocale currentLocale]];
[_formatter setDateFormat:@"yyyy-MM-dd hh:mm a"];
NSString *_date=[_formatter stringFromDate:currentDate];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"StartDate <= %@ AND EndDate = %@", _date, _date];
if (shortPrograms.count > 0) {
[shortPrograms removeAllObjects];
}
//collectionArr have multiple dictionaries ,which has start date and end date.
//collectionArr = [[NSArray alloc] initWithObjects:[NSDictionary dictionaryWithObjectsAndKeys:@"..Sdate..",@"Startdate",@"..Edate..",@"Enddate", nil], nil];
//shortPrograms is a filter are, having the date in between start date and end date.
[shortPrograms addObjectsFromArray:[collectionArr filteredArrayUsingPredicate:predicate]];
答案 0 :(得分:2)
您的shortPrograms
数组包含来自collectionArr
的对象的子集。听起来你想要从shortPrograms
获取一个对象,并确定它来自collectionArr
的位置。
一般情况下你不能。但如果collectionArr
中的所有对象都是唯一的,那么就有可能。
id someObject = shortPrograms[someIndex]; // get some value
NSUInteger originalIndex = [collectionArr indexOfObject:someObject];
如果collectionArr
中的对象不是唯一的,那么这将无效,因为无法知道您正在处理哪些重复项。
答案 1 :(得分:2)
如果要根据某些比较从数组中获取索引,则应使用indicesOfObjectsPassingTest:而不是谓词。您似乎想要查找结束时间与当前日期(包括时间)相同的对象的索引。仅当键EndDate的值是NSDate对象而不是字符串时,这才有效。此外,假设您的开始日期始终与结束日期相同或更早,则没有理由检查开始时间,只检查结束日期。这就是你如何使用我上面提到的方法:
NSIndexSet *indxs = [collectionArr indexesOfObjectsPassingTest:^BOOL(NSDictionary *dict, NSUInteger idx, BOOL *stop) {
return (fabs([dict[@"EndDate"] timeIntervalSinceNow]) < 10);
}];
NSLog(@"%@",indxs);
这将返回任何字典的索引,其中键EndDate的值小于当前时间和日期的10秒。
答案 2 :(得分:0)
从我的小知识来看,不可能与NSPredicate
NSPredicate
中没有可用于返回索引位置的方法。
您可能必须实施自己的逻辑才能实现目标。