具有 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 中设置重复间隔和触发日期