具有 UNNotificationRequest 的计算属性返回无法将类型“Void”的返回表达式转换为返回类型“[UNNotificationRequest]”

Posted

技术标签:

【中文标题】具有 UNNotificationRequest 的计算属性返回无法将类型“Void”的返回表达式转换为返回类型“[UNNotificationRequest]”【英文标题】:Computed property with UNNotificationRequest returns Cannot convert return expression of type 'Void' to return type '[UNNotificationRequest]' 【发布时间】:2020-05-12 00:38:33 【问题描述】:

我有一个处理本地通知的类,我想根据是否已安排任何通知来确定它们是否已启用。所以我想我可以尝试创建一个包含所有计划通知的数组的计算属性,但我认为有些东西我不明白,因为我收到以下错误:

无法将“Void”类型的返回表达式转换为“[UNNotificationRequest]”类型的返回表达式

var notifications: [UNNotificationRequest] 
    center.getPendingNotificationRequests  notifications in return notifications 

只需从完成处理程序中打印通知就可以正常工作,因此我能够正确获取它们,只是不将它们分配给变量。

我也尝试创建一个单独的变量并返回它,但这始终默认为我提供的空默认值。

var notifications: [UNNotificationRequest] 
    var retrievedNotifications: [UNNotificationRequest]?
    center.getPendingNotificationRequests  notifications in retrievedNotifications = notifications 
    return retrievedNotifications ?? []

任何提示或指示将不胜感激。

【问题讨论】:

因为您的块在单独的线程上运行.. 所以它总是返回默认值... 谢谢@Harsh 我不知道。解决方案是什么?将 DispatchQueue.main.async 添加到我尝试的第二个选项并不能解决问题。 这仍然无法解决问题,因为您已经在块中处于异步模式...您需要找到一种方法来等待您的异步过程完成..可能使用调度组。 可能我的回答应该有效。 【参考方案1】:

您可能可以使用如下的调度组。您实际上在做的是等待从线程中检索所有通知,然后继续



var notifications: [UNNotificationRequest] 
    var retrievedNotifications: [UNNotificationRequest] = []

    let group = DispatchGroup()
    group.enter()

    // avoid deadlocks by not using .main queue here
    DispatchQueue.global(attributes: .qosDefault).async 
        center.getPendingNotificationRequests  notifications in
            retrievedNotifications = notifications
            group.leave()
        
    

    // wait ...
    group.wait()

    return retrievedNotifications

【讨论】:

以上是关于具有 UNNotificationRequest 的计算属性返回无法将类型“Void”的返回表达式转换为返回类型“[UNNotificationRequest]”的主要内容,如果未能解决你的问题,请参考以下文章

UNNotificationRequest 仅在 iPhone 解锁时播放自定义声音

UNNotificationRequest 中的开始和结束日期

从请求中检索 UNNotificationRequest 声音名称

如何在 UNNotificationRequest 中设置重复间隔和触发日期

UNNotificationRequest 需要唯一标识符,但也会触发重复项

动作按钮的 Swift UNNotificationRequest 标识符点击了本地通知