Как отсортировать массив UNNotificationRequests по nextTriggerDate

У меня есть массив UNNotificationRequest, Я хочу отсортировать их по nextTriggerDate,

Насколько я понимаю, я бы отсортировал массив с помощью array.sorted(by:predicate)

let sortedNotifications = notificationRequests.sorted(by: { $0.trigger.nextTriggerDate?.compare($1.trigger.nextTriggerDate!) == .orderedAscending })

Однако проблема в том, .trigger не имеет nextTriggerDate имущество.

Чтобы получить nextTriggerDateЯ должен извлечь триггер и бросить его в UNCalendarNotificationTrigger, Что, насколько я знаю, не может быть сделано в предикате.

Какие-нибудь мысли?

1 ответ

Решение

Вы можете создать Tuple С UNNotificationRequest и nextTriggerDate (UNNotificationRequest,nextTriggerDate)

// get request with date Tuple -->  example : (value0,value1)

let requestWithDateTuple =  notificationRequests.map({ (req) -> (UNNotificationRequest,Date?)? in
                    guard let trigger = req.trigger as? UNCalendarNotificationTrigger else {
                        return nil
                    }
                    return (req,trigger.nextTriggerDate())
                }).compactMap({$0})

                // you will get Tuple (request,Date) ,sort them by date  
               let sortedTuple = requestWithDateTuple.sorted(by: { $0.1?.compare($1.1!) == .orderedAscending })

// sorted request only 
let requestSorted =  sortedTuple.map({$0.0})
Другие вопросы по тегам