View+Notification.swift (2769B)
1 // MIT License 2 // Copyright © John Sundell 3 // 4 // Permission is hereby granted, free of charge, to any person obtaining a copy of this software 5 // and associated documentation files (the "Software"), to deal in the Software without restriction, 6 // including without limitation the rights to use, copy, modify, merge, publish, distribute, 7 // sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is 8 // furnished to do so, subject to the following conditions: 9 // 10 // The above copyright notice and this permission notice shall be included in all copies or 11 // substantial portions of the Software. 12 // 13 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING 14 // BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 15 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 16 // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 17 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 18 // 19 import SwiftUI 20 21 extension View { 22 func onNotification( 23 _ notificationName: Notification.Name, 24 perform action: @escaping () -> Void 25 ) -> some View { 26 onReceive(NotificationCenter.default 27 .publisher(for: notificationName) 28 ) { _ in 29 action() 30 } 31 } 32 func onNotification( 33 _ notificationName: Notification.Name, 34 perform action: @escaping (_ notification: Notification) -> Void 35 ) -> some View { 36 onReceive(NotificationCenter.default 37 .publisher(for: notificationName) 38 ) { notification in 39 action(notification) 40 } 41 } 42 43 func onNotificationM( // M for main thread 44 _ notificationName: Notification.Name, 45 perform action: @escaping () -> Void 46 ) -> some View { 47 onReceive(NotificationCenter.default 48 .publisher(for: notificationName) 49 .receive(on: RunLoop.main) 50 ) { _ in 51 action() 52 } 53 } 54 55 func onNotificationM( // M for main thread 56 _ notificationName: Notification.Name, 57 perform action: @escaping (_ notification: Notification) -> Void 58 ) -> some View { 59 onReceive(NotificationCenter.default 60 .publisher(for: notificationName) 61 .receive(on: RunLoop.main) 62 ) { notification in 63 action(notification) 64 } 65 } 66 67 @MainActor func onAppEnteredBackground( 68 perform action: @escaping () -> Void 69 ) -> some View { 70 onNotification( 71 UIApplication.didEnterBackgroundNotification, 72 perform: action 73 ) 74 } 75 }