通过开始日期过滤NSMutableArray对象

时间:2013-03-07 16:07:44

标签: ios objective-c nsmutablearray timestamp date-range

我正在开发一个iOS应用程序,我有一个NSMutableArray对象,对象是具有开始日期和结束日期的事件。 开始日期采用时间戳格式,结束日期不是。

我想根据用户输入的日期(datePicker)过滤该数组。

现在我有了这段代码并且部分正常工作,因为假设一个事件将从3月30日开始到4月2日结束,如果用户输入3月30日之前的任何日期,该事件将出现在我的列表中(这没关系)但是如果用户输入,请说三月31日不会过滤相同的事件而这是错误的,因为事件要发生。

if(datePickerInTimeStamp>0)
    {
        //I know I might use while instead of an if 
        for (EventObj *_eventObj in eventsList)
        {

            if(_eventObj.dateDebutTimeStamp>0){

                if ( datePickerInTimeStamp <= _eventObj.dateDebutTimeStamp)

                    [self._filteredListCaleventsList addObject:_eventObj];


            }
        }
    }

我正在考虑将结束日期转换为时间戳并使用某种范围检查。

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

我不是100%明确你希望过滤器过滤的内容,但这里有一些建议:

  1. 使用OO设计。教你的活动以表明它们是否匹配。
  2. 使用NSDate比较方法earlyDate:和laterDate:
  3. 我会从您的问题中猜测您想要选择在用户选择日期时发生的事件:

    // in your class EventObj.m
    
    // answer true if date is between the event start and end
    - (BOOL)isOccurringOn:(NSDate *)date {
        return [self.start == [self.start earlierDate:date]] &&
               [self.end == [self.end laterDate:date]];
    }
    

    如果你想过滤一些对事件来说很自然的方式,比如之前的开始,之前的开始,之前的结束等等,这里有BOOL应答方法。

    现在你的EventObj做了一些有意义且易于阅读的东西,你的循环也更漂亮:

    // get NSDate *selectedDate from user
    // using your var names, though the _underscores are strange ...
    
    for (EventObj *_eventObj in eventsList) {
        if ([_eventObj isOccurringOn:selectedDate]) {
            [self._filteredListCaleventsList addObject:_eventObj];
        }
    }
    

答案 1 :(得分:1)

如果你是一个人,那么这就是你所做的事情:

self.filteredListCaleventsList = [eventsList filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"dateDebutTimeStamp >= %@", datePickerInTimeStamp]];

请注意,它使用动态定义的谓词而没有变量来保存它。如果您认为代码对变量更具可读性,则可以定义一个。

我还借此机会删除了属性名称开头的下划线,符合标准命名约定。下划线用于表示支持属性的ivar(在正常情况下,有背面ivar)。