Swift Combine 响应式 Demo

一个Combine Demo。 Combine是苹果发布的响应式框架,iOS13一起发布的,所以最低iOS13才能使用。

做了一个简单登录界面的异步处理演示。

页面逻辑说明:

  1. 获取验证码按钮是否启用(isEnabled)跟手机号输入框值是否有效有关。输入11位长度字符串获取验证码按钮isEnabled变为true。

  2. 登录按钮是否启用(isEnabled)跟三个控件状态或值相关联,分别是:手机号输入框内容、验证码输入框内容以及同意隐私政策开关。三个控件同时满足校验才能改登录按钮isEnabled位true。

代码部分

创建三个用@Published修饰的变量,用于接受控件内容

Swift 复制代码
@Published var phone: String? = ""
@Published var verifyCode: String? = ""
@Published var isAgree: Bool = false

@IBAction func phoneChanged(_ sender: UITextField) { phone = sender.text }
@IBAction func verifyCodeChanged(_ sender: UITextField) { verifyCode = sender.text }
@IBAction func agreeChanged(_ sender: UISwitch) { isAgree = sender.isOn }

创建校验手机号发布者,输出值为布尔类型

Swift 复制代码
// 校验手机号的发布者
var phoneValid: AnyPublisher<Bool, Never> {
    $phone
        .map { $0?.count == 11 ? true : false }
        .eraseToAnyPublisher()
    }

创建校验验证码发布者

Swift 复制代码
// 校验验证码的发布者
var verifyCodeValid: AnyPublisher<Bool, Never> {
    $verifyCode
        .map { code in
            guard                   // 验证码校验逻辑(实际情况按照需求自定义)
                let code = code,    // 值不能为nil
                code.count == 4,    // 长度为4
                let _ = Int(code)   // 能转为Int
            else { return false }   // 以上三种全部满足返回true,否则返回false

            return true
        }
        .eraseToAnyPublisher()      // 抹去类型转为AnyPublisher
}

合并三个发布者 - CombineLatest

Swift 复制代码
// 融合三个发布者
Publishers.CombineLatest3(phoneValid, verifyCodeValid, $isAgree)
    .map { $0 && $1 && $2 }                 // 筛选逻辑
    .receive(on: RunLoop.main)              // 在主线程接受
    .assign(to: \.isEnabled, on: toLogin)   // 结果分配
    .store(in: &subscriptions)              // 返回值Cancellable对象储存在全局容器中

Demo代码地址

相关推荐
gf13211111 天前
python_图片、字幕文本、音频一键组合
python·音视频·swift
linweidong1 天前
猫眼ios开发面试题及参考答案(上)
swift·三次握手·ios面试·nsarray·苹果开发·ios内存·nstimer
2501_915909062 天前
手机崩溃日志导出的工程化体系,从系统级诊断到应用行为分析的多工具协同方法
android·ios·智能手机·小程序·uni-app·iphone·webview
2501_915106322 天前
App HTTPS 抓包实战解析,从代理调试到真实网络流量观察的完整抓包思路
网络协议·http·ios·小程序·https·uni-app·iphone
要站在顶端2 天前
iOS自动化测试全流程教程(基于WebDriverAgent+go-ios)
开发语言·ios·golang
2501_916008892 天前
深入理解 iPhone 文件管理,从沙盒结构到开发调试的多工具协同实践
android·ios·小程序·https·uni-app·iphone·webview
腾讯云qcloud07552 天前
腾讯位置商业授权iOS 轨迹SDK
macos·ios·cocoa
2501_916007472 天前
没有 Mac,如何在 Windows 上架 iOS 应用?一套可落地的工程方案
android·macos·ios·小程序·uni-app·iphone·webview
2501_915106322 天前
uni-app 上架 iOS 的完整实践,从跨端开发到稳定提交的工程路径
android·ios·小程序·uni-app·cocoa·iphone·webview
2501_916007472 天前
HTTPS工作原理与重要性:全面安全指南
网络协议·安全·ios·小程序·https·uni-app·iphone