RxSwift样例五 GitHubSignup

这篇博客通过GitHubSignup的示例探讨RxSwift在MVVM架构中的应用。示例分为两种实现,主要代码逻辑集中在GithubSignupViewModel2中,展示了如何用响应式方式绑定控制器与模型。文章强调了面向协议编程的重要性,以减少上帝类并实现多协议遵守。同时,文中指出了validateUsername方法在网络查询上的优化可能性,如延迟请求和输入限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

GitHubSignup 这个demo是相对比较大的demo,计划分俩次来讲。

可以看到有两个一样的storyboard。他们只有使用driver和使用Observer的区别。看一个就足够了,以driver为例。

可以看到主要的代码逻辑在GithubSignupViewModel2里面,在controller里面将controller的值与model绑定,这也是使用响应式开发最便捷的代码MVVM分级。

model里面 let API: GitHubAPI ,API是遵守 GitHubAPI协议的,这种面向协议编程是swift首推的,主旨是为了减少上帝类,一个类包含很多不必要属性和方法。而且因为swift不能像java那样多继承,A类中的方法B类要使用旧只能成为A的子类。使用面向协议编程可以多协议遵守,就可以规避这个问题。事实上,swift原生的API都是选择这样编程。

        validatedUsername = input.username
            .flatMapLatest { username in
                return validationService.validateUsername(username)
                    .asDriver(onErrorJustReturn: .failed(message: "Error contacting server"))
            }

validatedUsername 是输入username经过validateUsername方法返回的事件元素。validateUsername这个方法实现是这样的

    func usernameAvailable(_ username: String) -> Observable<Bool> {
        // this is ofc just mock, but good enough

        let url = URL(string: "https://github.com/\(username.URLEscaped)")!
        let request = URLRequest(url: url)
        return self.URLSession.rx.response(request: request)
            .map { (response, _) in
                return response.statusCode == 404
            }
            .catchErrorJustReturn(false)
    }

直接查询https://github.com/(username.URLEscaped)这个url,如果404,则表示此链接下无值,也就没有注册过这个用户名。这里其实可以做到更好。因为这样写是每次字符串有变化的时候就进行网络查询。应该做成隔几秒可以请求,并且字符串小于一定数量不请求,俩次输入一样不请求。

密码输入和确认密码就比较简单了。最后的注册也只是一个模拟,并没有真正注册github

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值