combin异步编程

85 阅读1分钟
  • ViewModel
import Foundation
import Combine

class RegisterViewModel:ObservableObject {
    // 输入
    @Published var username = ""
    @Published var password = ""
    
    // 输出
    @Published var checkUsername = false
    @Published var checkPassword = false
    
    // 取消订阅
    private var cancelSet:Set<AnyCancellable> = []
    
    init() {
        // 账户校验
        $username.receive(on: RunLoop.main)
            .map { username in
                username.count > 0
            }
            .assign(to: \.checkUsername, on: self)
            .store(in: &cancelSet)
        
        // 密码校验
        $password.receive(on: RunLoop.main)
            .map { password in
                !password.isEmpty
            }
            .assign(to: \.checkPassword, on: self)
            .store(in: &cancelSet)
        
    }
}
  • 错误提示view
struct InputErrorView: View {
    
    var message = ""
    
    var body: some View {
        HStack(alignment: .center) {
            Image(systemName: "exclamationmark.circle.fill")
                .foregroundColor(.red)
            Text(message)
                .foregroundColor(.red)
        }
        .padding(.leading,10)
    }
}

struct InputErrorView_Previews: PreviewProvider {
    static var previews: some View {
        InputErrorView()
    }
}
  • 主页面
struct RegisterView: View {
    
    @ObservedObject private var viewModel = RegisterViewModel()
    
    var body: some View {
        
        VStack(alignment: .leading) {
            TextField("请输入账户", text: $viewModel.username)
                .font(.system(size: 20,weight: .black))
                .padding(.horizontal)
            Divider()
                .background(.red)
                .padding(.horizontal)
            
            if viewModel.checkUsername == false {
                InputErrorView(message: "请输入账户")
            }
            
            SecureField("请输入密码", text: $viewModel.password)
                .font(.system(size: 20,weight: .black))
                .padding(.horizontal)
                .padding(.top,20)
            
            Divider()
                .background(.red)
                .padding(.horizontal)
            
            if viewModel.checkPassword == false {
                InputErrorView(message: "请输入密码")
            }
            
            Button {
                print("注册操作")
            } label: {
                Text("注册")
                    .font(.system(size: 20,weight: .bold))
                    .foregroundColor(.white)
                    .padding(.top,10)
                    .padding(.bottom,10)
            }
            .frame(maxWidth: .infinity)
            .background(.black)
            .cornerRadius(8)
            .padding(.top,20)
            .padding(.horizontal)

        }
        
    }
}

struct RegisterView_Previews: PreviewProvider {
    static var previews: some View {
        RegisterView()
    }
}
截屏2022-11-14 13.12.46.png