Стендап Сьогодні 📢 Канал в Telegram @stendap_sogodni

🤖🚫 Контент вільний від AI. Цей пост на 100% написаний людиною, як і все на моєму блозі. Насолоджуйтесь!

08.02.2024

Асинхронні функції з синхронними назвами

Досить багато часу провів в пошуках помилки в програмі на SwiftUI, яка була спричинена функцією removeAllPendingNotificationRequests. Ця функція видаляє всі заплановані локальні сповіщення.

В мене був дуже простий алгоритм для оновлення плану сповіщень: почистити всі, що були, та створити нові. Операція не така вже й важка, тож можна було дозволити собі таку неефективність заради спрощення логіки.

Але чомусь мої сповіщення ніяк не зʼявлялись. Я вже все перевірив: зміст, розклад, дозволи, запуск на симуляторі та на справжньому телефоні. (До речі, багато систем в iOS погано працюють на симуляторі — але сповіщення не одна з них.)

Нарешті, знайшов відповідь у документації. Виявилось, що функція removeAllPendingNotificationRequests виконується асинхронно. Тож поки я створював свої нові сповіщення, вона їх тихесенько видаляла! Ба більше, у цієї функції навіть немає ані колбека, ані іншого способу дізнатись, що вона завершилась. Напевно, задум такий, що ти її будеш викликати для остаточної зачистки, коли користувач вимкнув сповіщення — або щось таке.

На мою думку, асинхронна функція має бути очевидною. В TypeScript, наприклад, гарно повертати Promise. Або, у Swift в тому ж класі UNUserNotificationCenter є інші функції, що приймають колбек. А про цю чомусь забули.

…Щоб виправити помилку, можна отримати перелік запланованих сповіщень функцією getPendingNotificationRequests (до речі, яка приймає колбек!) та видалити конкретно їх. Або, в такому разі, можна вже й не видаляти, а пропускати при створенні.