You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按nextTriggerDate对UNNotificationRequest数组进行排序?

解决UNNotificationRequest数组按nextTriggerDate排序的问题

你说得对,UNNotificationTrigger本身并没有nextTriggerDate属性——这个属性是它的具体子类(比如UNCalendarNotificationTrigger、UNTimeIntervalNotificationTrigger)才有的。不过不用担心,在sorted(by:)的闭包里完全可以做类型转换和日期提取,不需要用谓词来实现,而且逻辑会更灵活。

步骤1:写一个辅助函数提取有效日期

先封装一个小函数,用来从任意UNNotificationTrigger中提取它的nextTriggerDate,这样排序逻辑会更清晰:

private func extractNextTriggerDate(from trigger: UNNotificationTrigger?) -> Date? {
    guard let trigger = trigger else { return nil }
    
    // 根据你需要处理的trigger类型,添加对应的case
    switch trigger {
    case let calendarTrigger as UNCalendarNotificationTrigger:
        return calendarTrigger.nextTriggerDate()
    case let intervalTrigger as UNTimeIntervalNotificationTrigger:
        return intervalTrigger.nextTriggerDate()
    // 如果有其他类型(比如UNLocationNotificationTrigger,不过它没有nextTriggerDate),可以忽略或按需求处理
    default:
        return nil
    }
}

步骤2:用这个函数实现排序

接下来在排序闭包里,我们可以处理各种边界情况(比如某个trigger无法提取日期的情况),然后按日期升序排列:

let sortedNotifications = notificationRequests.sorted { requestA, requestB in
    let dateA = extractNextTriggerDate(from: requestA.trigger)
    let dateB = extractNextTriggerDate(from: requestB.trigger)
    
    // 定义排序优先级:
    switch (dateA, dateB) {
    case (nil, nil):
        // 两个都没有有效日期,这里选择保持原数组顺序,你也可以改成按identifier排序等规则
        return false
    case (nil, _):
        // 没有日期的请求排到后面
        return false
    case (_, nil):
        // 有日期的请求排到前面
        return true
    case let (validDateA?, validDateB?):
        // 都有日期时,按升序排列
        return validDateA.compare(validDateB) == .orderedAscending
    }
}

补充说明

  • 如果你的场景里只需要处理UNCalendarNotificationTrigger,可以把辅助函数里的case只保留这一种即可。
  • 对于没有有效日期的请求,你可以根据自己的需求调整排序规则(比如按通知的identifier排序,或者直接放到数组末尾)。

内容的提问来源于stack exchange,提问作者Jared

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:04:57