iOS文档说UNUserNotificationCenter
的`removeAllPendingNotificationRequests()是异步的。
我想做的是:
致电removeAllPendingNotificationRequests()
以取消我的所有预定通知
安排一堆新通知,其中一些可能会或可能不会具有与之前相同的ID
但是由于文档说该方法是在另一个线程上异步运行(并且没有完成回调参数),我担心有时候,根据线程的变化和时间等因素,步骤#1仍然会因为我正在创建第2步中的内容,因此它也会杀死我正在制作的一些新通知。
这种东西手动测试有点棘手,因为它取决于时间。所以我很好奇有人知道这是否是我应该担心的事情......
答案 0 :(得分:2)
在添加通知的文档中,我发现了这一点:
调用-addNotificationRequest:将替换现有的通知 请求具有相同的标识符。
也许解决方案是这样的:
let center = UNUserNotificationCenter.current()
// Create new requests
let newRequests: [UNNotificationRequest] = [...]
let identifiersForNew: [String] = newRequests.map { $0.identifier }
center.getPendingNotificationRequests { pendingRequests in
// Get all pending notification requests and filter only the ones that will not be replaced
let toDelete = pendingRequests.filter { !identifiersForNew.contains($0.identifier) }
let identifiersToDelete = toDelete.map { $0.identifier }
// Delete notifications that will not be replaced
center.removePendingNotificationRequests(withIdentifiers: identifiersToDelete)
// Add all new requests
for request in newRequests {
center.add(request, withCompletionHandler: nil)
}
}
答案 1 :(得分:0)
我和您的情况相同,并且知道我对这段代码没有问题:
center.getPendingNotificationRequests(completionHandler: { notifications in
var notificationIds:[String] = []
for notification in notifications {
if notification.identifier != "something_taht_I_dont_dismiss"{
notificationIds.append(notification.identifier)
}
}
self.center.removePendingNotificationRequests(withIdentifiers: notificationIds)
createAllNewNotifications()
})
如果您要仔细检查所有是否删除了待处理的通知,则可以创建简单的递归方法进行检查。
func removeAllNotificationsSafe() {
center.removeAllPendingNotificationRequests()
checkNotificationsAreRemoved()
}
func checkNotificationsAreRemoved() {
center.getPendingNotificationRequests(completionHandler: { notifications in
if notifications.count > 0 {
self.checkNotificationsAreRemoved()
} else {
self.doWhathverYouWant()
}
}
}
我认为这不是必需的,因为UNUserNotificationCenter的所有操作将彼此同步。