From 15db283ec1e898c7e356e7047c5b869ce5b736c9 Mon Sep 17 00:00:00 2001 From: Stuart Breckenridge Date: Sat, 11 Mar 2023 19:01:17 +0800 Subject: [PATCH] SwiftUI Views monitor notifs via .task & for await --- .../Extensions/AddExtensionListView.swift | 6 ++-- .../Extensions/EnableExtensionPointView.swift | 6 ++-- .../Extensions/ExtensionsManagementView.swift | 6 ++-- iOS/Settings/General/SettingsView.swift | 12 +++---- .../NewArticleNotificationsView.swift | 34 ++++++++++++------- 5 files changed, 38 insertions(+), 26 deletions(-) diff --git a/iOS/Settings/Account and Extensions/Extensions/AddExtensionListView.swift b/iOS/Settings/Account and Extensions/Extensions/AddExtensionListView.swift index 970d5929d..e58d51ca0 100644 --- a/iOS/Settings/Account and Extensions/Extensions/AddExtensionListView.swift +++ b/iOS/Settings/Account and Extensions/Extensions/AddExtensionListView.swift @@ -50,8 +50,10 @@ struct AddExtensionListView: View { } } } - .onReceive(NotificationCenter.default.publisher(for: .ActiveExtensionPointsDidChange)) { _ in - dismiss() + .task { + for await _ in NotificationCenter.default.notifications(named: .ActiveExtensionPointsDidChange) { + await MainActor.run(body: { dismiss() }) + } } } diff --git a/iOS/Settings/Account and Extensions/Extensions/EnableExtensionPointView.swift b/iOS/Settings/Account and Extensions/Extensions/EnableExtensionPointView.swift index a662d21af..5a40e1f64 100644 --- a/iOS/Settings/Account and Extensions/Extensions/EnableExtensionPointView.swift +++ b/iOS/Settings/Account and Extensions/Extensions/EnableExtensionPointView.swift @@ -32,8 +32,10 @@ struct EnableExtensionPointView: View { .navigationTitle(extensionPoint.title) .navigationBarTitleDisplayMode(.inline) .dismissOnExternalContextLaunch() - .onReceive(NotificationCenter.default.publisher(for: .ActiveExtensionPointsDidChange)) { _ in - dismiss() + .task { + for await _ in NotificationCenter.default.notifications(named: .ActiveExtensionPointsDidChange) { + await MainActor.run { dismiss() } + } } .edgesIgnoringSafeArea(.bottom) } diff --git a/iOS/Settings/Account and Extensions/Extensions/ExtensionsManagementView.swift b/iOS/Settings/Account and Extensions/Extensions/ExtensionsManagementView.swift index dee971c3d..7a380f11c 100644 --- a/iOS/Settings/Account and Extensions/Extensions/ExtensionsManagementView.swift +++ b/iOS/Settings/Account and Extensions/Extensions/ExtensionsManagementView.swift @@ -51,8 +51,10 @@ struct ExtensionsManagementView: View { } message: { Text("This action cannot be undone.", comment: "Alert message: confirmation that deactivation of extension cannot be undone.") } - .onReceive(NotificationCenter.default.publisher(for: .ActiveExtensionPointsDidChange)) { _ in - availableExtensionPointTypes = ExtensionPointManager.shared.availableExtensionPointTypes.sorted(by: { $0.title < $1.title }) + .task { + for await _ in NotificationCenter.default.notifications(named: .ActiveExtensionPointsDidChange) { + await MainActor.run { availableExtensionPointTypes = ExtensionPointManager.shared.availableExtensionPointTypes.sorted(by: { $0.title < $1.title }) } + } } } diff --git a/iOS/Settings/General/SettingsView.swift b/iOS/Settings/General/SettingsView.swift index 32b3b13b0..4609fa27e 100644 --- a/iOS/Settings/General/SettingsView.swift +++ b/iOS/Settings/General/SettingsView.swift @@ -101,15 +101,13 @@ struct SettingsView: View { } .task { UNUserNotificationCenter.current().getNotificationSettings { settings in - DispatchQueue.main.async { - self.viewModel.notificationPermissions = settings.authorizationStatus - } + Task { await MainActor.run { self.viewModel.notificationPermissions = settings.authorizationStatus }} } } - .onReceive(NotificationCenter.default.publisher(for: UIScene.willEnterForegroundNotification)) { _ in - UNUserNotificationCenter.current().getNotificationSettings { settings in - DispatchQueue.main.async { - self.viewModel.notificationPermissions = settings.authorizationStatus + .task { + for await _ in NotificationCenter.default.notifications(named: UIScene.willEnterForegroundNotification) { + UNUserNotificationCenter.current().getNotificationSettings { settings in + Task { await MainActor.run { self.viewModel.notificationPermissions = settings.authorizationStatus }} } } } diff --git a/iOS/Settings/New Article Notifications/NewArticleNotificationsView.swift b/iOS/Settings/New Article Notifications/NewArticleNotificationsView.swift index db94b12a8..e30297851 100644 --- a/iOS/Settings/New Article Notifications/NewArticleNotificationsView.swift +++ b/iOS/Settings/New Article Notifications/NewArticleNotificationsView.swift @@ -28,24 +28,32 @@ struct NewArticleNotificationsView: View, Logging { } .tint(Color(uiColor: AppAssets.primaryAccentColor)) - .onReceive(NotificationCenter.default.publisher(for: .FaviconDidBecomeAvailable)) { notification in - guard let faviconURLString = notification.userInfo?["faviconURL"] as? String, - let faviconHost = URL(string: faviconURLString)?.host else { - return - } - activeAccounts.forEach { account in - for feed in Array(account.flattenedWebFeeds()) { - if let feedURLHost = URL(string: feed.url)?.host { - if faviconHost == feedURLHost { - feed.objectWillChange.send() + .task { + for await notification in NotificationCenter.default.notifications(named: .FaviconDidBecomeAvailable) { + await MainActor.run { + guard let faviconURLString = notification.userInfo?["faviconURL"] as? String, + let faviconHost = URL(string: faviconURLString)?.host else { + return + } + activeAccounts.forEach { account in + for feed in Array(account.flattenedWebFeeds()) { + if let feedURLHost = URL(string: feed.url)?.host { + if faviconHost == feedURLHost { + feed.objectWillChange.send() + } + } } } } } } - .onReceive(NotificationCenter.default.publisher(for: .WebFeedIconDidBecomeAvailable)) { notification in - guard let webFeed = notification.userInfo?[UserInfoKey.webFeed] as? WebFeed else { return } - webFeed.objectWillChange.send() + .task { + for await notification in NotificationCenter.default.notifications(named: .WebFeedIconDidBecomeAvailable) { + await MainActor.run { + guard let webFeed = notification.userInfo?[UserInfoKey.webFeed] as? WebFeed else { return } + webFeed.objectWillChange.send() + } + } } }