ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

TTGSnackbar 与 Swift 并发:如何用 async/await 优雅处理交互结果

TTGSnackbar 与 Swift 并发:如何用 async/await 优雅处理交互结果 TTGSnackbar 与 Swift 并发如何用 async/await 优雅处理交互结果【免费下载链接】TTGSnackbarTTGSnackbar shows simple message and action button on the bottom or top of the screen with multi kinds of animation, which is written in Swift and inspired by Snackbar in Android. It also support showing custom view, icon image or multi action button.项目地址: https://gitcode.com/gh_mirrors/tt/TTGSnackbarTTGSnackbar 是一个用 Swift 编写的 iOS Snackbar 提示组件灵感来自 Android 的 Snackbar能在屏幕底部或顶部展示消息和操作按钮并内置多种动画效果。它完整支持 Swift 并发async/await通过TTGSnackbar.show(configuration:)静态方法你可以优雅地等待用户点击、滑动、按钮操作或自动消失等交互结果彻底告别层层嵌套的回调闭包。本文用一个“撤销删除”的真实场景带你快速掌握这套异步交互 API。TTGSnackbar 是什么Swift 世界里的轻量提示条组件TTGSnackbar 是一款纯 Swift 实现的 iOS 提示条组件核心文件只有几个开箱即用支持屏幕底部或顶部展示内置 7 种入场/退场动画支持主/次操作按钮、纯图标按钮和自定义UIView内容内置default / info / success / warning / error / loading语义样式通过TTGSnackbarManager实现排队、替换、去重三种展示策略完整支持Swift Concurrency可用 async/await 等待交互结果。环境要求Swift 5.9、Xcode 15、iOS 16.0。为什么用 async/await 处理 Snackbar 交互结果传统写法中一个带“撤销”按钮的 Snackbar 要同时处理按钮点击和自动消失两个结果只能靠闭包 标志位代码容易变得散乱let snackbar TTGSnackbar(message: 文件已删除, duration: .middle) snackbar.actionText 撤销 snackbar.actionBlock { snackbar in restoreFile() snackbar.dismiss() } snackbar.didDismissBlock { _ in print(提示条已消失) } snackbar.show()当业务越来越复杂双按钮、点击、滑动、队列丢弃……回调会越嵌越深。而 Swift 并发提供了一种更贴近直觉的写法把“等待用户交互”当作一个可 await 的异步结果让代码从上到下线性阅读。这也是本文的主角——TTGSnackbar 的 async helper 设计初衷其核心实现位于 TTGSnackbarAsync.swift。认识返回结果 TTGSnackbarResult一次交互多种结局async 版本的展示方法会返回一个TTGSnackbarResult枚举定义在 TTGSnackbarTypes.swift 中结果含义.action用户点击了主操作按钮.secondAction用户点击了第二操作按钮.tapped用户点击了 Snackbar 本体.swiped(方向)用户向某个方向滑动.dismissed正常展示完毕自动消失.dropped被 Manager 策略同步丢弃.failedToPresent没有可用的 window 或容器展示失败一次展示只会产生一个结果天然避免了“回调被触发多次”的边界问题。核心用法一行 await 拿到交互结果async 版的用法非常直观传入一个TTGSnackbarConfiguration值对象即可let result await TTGSnackbar.show(configuration: .init( message: 文件已删除, duration: .long, style: .warning, actionText: 撤销 )) switch result { case .action: undoDelete() // 用户点了“撤销” case .dismissed: print(用户未操作提示条自动消失) case .dropped: print(Manager 策略丢弃了本次展示) case .failedToPresent: print(没有可用的 window 或容器) default: break }有没有注意到这里甚至不需要手动调用dismiss()——async helper 会在用户点击按钮后自动完成关闭并返回.action。整个“展示 → 等待 → 决策”的流程被压缩成了一个await阅读体验接近同步代码。内部实现上它借助withCheckedContinuation把 Snackbar 的各个回调统一桥接为一次续体恢复并且标记了MainActor保证在主线安全地操作 UI具体细节可以参考 TTGSnackbarAsync.swift。进阶配合 TTGSnackbarManager 处理排队场景真实 App 里多个 Snackbar 可能同时竞争展示。此时可以把 Manager 和展示策略一并传入async 方法同样能返回被“丢弃”的结果let result await TTGSnackbar.show( configuration: .init( message: 网络已断开, duration: .long, style: .error ), manager: TTGSnackbarManager.shared, policy: .replaceCurrent // 立即替换当前展示的 Snackbar ) if result .dropped { print(相同消息正在展示新提示条被去重丢弃) }三种策略.enqueue、.replaceCurrent、.dropIfShowingSameMessage与普通 API 完全一致具体实现可查看 TTGSnackbarManager.swift。异步模式下被丢弃或展示失败的场景也会返回明确结果你不再需要额外判断返回值。实战场景长任务 loading 与取消操作上传、下载这类长耗时任务非常适合用.loading样式 .forever时长保持提示条常驻直到用户点击“取消”let result await TTGSnackbar.show(configuration: .init( message: 正在上传…, duration: .forever, style: .loading, actionText: 取消 )) if result .action { cancelUpload() // 用户点了取消立即终止任务 }如果只想区分“用户点击了提示条”和“用户滑动关闭”也可以这样写case .tapped: print(用户点了提示条本体) case .swiped(let direction): print(用户朝 \(direction) 方向滑动)3 个让异步代码更优雅的小技巧用Task { MainActor in ... }包裹Snackbar 涉及 UIKit异步调用务必回到主线程再更新 UI示例工程 ViewController.swift 中的showAsyncResult()就是标准写法。语义样式代替手写颜色.success、.error、.loading等样式会自动应用推荐配色、图标与触觉反馈让异步流程的视觉状态更统一。双按钮同样支持配置secondActionText后async 方法会返回.secondAction一个switch就能覆盖所有决策分支。总结TTGSnackbar 把 Swift 并发async/await真正落到了 Snackbar 交互上一个await就能拿到“点击、滑动、消失、丢弃、失败”的全部结果配合TTGSnackbarManager队列策略和语义样式几乎可以零样板代码地覆盖绝大多数提示场景。如果你的项目正受回调嵌套困扰不妨试着用这套异步 API 重构一次撤销、重试、长任务取消等交互体验会立刻不一样。【免费下载链接】TTGSnackbarTTGSnackbar shows simple message and action button on the bottom or top of the screen with multi kinds of animation, which is written in Swift and inspired by Snackbar in Android. It also support showing custom view, icon image or multi action button.项目地址: https://gitcode.com/gh_mirrors/tt/TTGSnackbar创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表