Есть ли способ отфильтровать массив дат, используя предикат для дня недели? - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть массив с пользовательскими объектами, которые имеют свойство NSDate. Я хотел бы как-то получить все объекты, чьи NSDate находятся в воскресенье, понедельник, вторник и так далее.

Я чувствую, что это невозможно с использованием предикатов, но надеюсь, что я ошибаюсь, и надеюсь, что есть способ без необходимости перебирать все объекты, получать даты, конвертировать их с помощью средства форматирования даты и затем вычислять день.

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Я думаю, что блочный метод кода предиката будет более выполнимым для выполнения этой задачи.

Вот мой код

    NSPredicate *pred = [NSPredicate predicateWithBlock:^BOOL(Object * _Nullable evaluatedObject, NSDictionary<NSString *,id> * _Nullable bindings) {

    NSCalendar* cal = [NSCalendar currentCalendar];
    NSDateComponents* comp = [cal components:NSCalendarUnitWeekday fromDate:evaluatedObject.mDate];
    NSInteger weekDay = [comp weekday]; // 1 = Sunday, 2 = Monday, etc.

    return weekDay == 4;
}];

NSArray *arrFilteredObject = [arrData filteredArrayUsingPredicate:pred];

Здесь Object - это мой класс пользовательских объектов, который содержит два поля, т.е. один NSString и один NSDate атрибут.

Вот мой класс Object для вашей справки

@interface Object : NSObject

@property (nonatomic, strong) NSString *title;
@property (nonatomic, strong) NSDate *mDate;

@end

Надеюсь, это поможет. Пожалуйста, дайте мне знать, если у вас возникнут какие-либо проблемы с этим подходом.

0 голосов
/ 01 ноября 2018

Я смог понять это. Вот мой путь в Objective-C, который, я уверен, может быть легко адаптирован для быстрой работы.

На самом деле у меня есть массив пользовательских объектов, каждый из которых имеет свойство NSDate, которое мне нужно фильтровать по дням недели.

Я достиг своего решения, добавив еще один пользовательский геттер для моего пользовательского объекта:

Интерфейс:

@property (nonatomic, retain, getter = dayOfWeek) NSString *dayOfWeek;

Реализация:

-(NSString*)dayOfWeek{
    return [[(AppDelegate*)[[UIApplication sharedApplication] delegate] dayOfWeekFormatter] stringFromDate:self.createdAt];
}

dayOfWeekFormatter - это NSDateFormatter, который я создаю в своем AppDelegate, который можно повторно использовать вместо его повторного создания каждый раз:

@property (strong, nonatomic) NSDateFormatter *dayOfWeekFormatter;

NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];

    self.dayOfWeekFormatter = [NSDateFormatter new];
    [self.dayOfWeekFormatter setDateFormat:@"eeee"];
    [self.dayOfWeekFormatter setLocale:locale];

Вы должны установить локаль!

Теперь я могу использовать этот предикат для фильтрации в любой день, который мне нужен. Вот пример для фильтрации всех объектов в среду:

NSArray *dayArray = [myTestArrayOfObjects filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"dayOfWeek == 'Wednesday'"]];
...