ReactiveCocoa6.0的开发指北
来源:互联网 发布:淘宝近期的促销活动 编辑:程序博客网 时间:2024/06/05 01:52
最新的ReactiveCocoa使用网上能找到的资料特别少,为了给接入swift版reactivecocoa的开发者提供便利,我就讲常用场景下的使用, 就拿注册页面来举例,如有异议和问题欢迎指正交流,言归正传,注册页面一般由一些信息需要用户填写,一般我们用UITableView展示,UITableView的使用我就不提了,上代码
fileprivate let verifyCode = MutableProperty<String>("")....func verifyCodeCell(at indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "verify_cell", for: indexPath) as! ABVerifyCodeCell self.verifyButton = cell.verifyCodeButton // import Then return cell.with { $0.textField.reactive.text <~ self.verifyCode.producer.take(until: cell.reactive.prepareForReuse) $0.textField.reactive .continuousTextValues .take(until: cell.reactive.prepareForReuse) .map { $0 ?? "" } .observeValues{ [weak self] in self?.verifyCode.value = String($0.characters.prefix(6)) } $0.verifyCodeButton.reactive .controlEvents(.touchUpInside) .take(until: cell.reactive.prepareForReuse) .observeValues { [weak self] _ in self?.getVerifyCode() } } }
由于cell重用问题,textField内容绑定必须调用以下方法来实现重用时解除之前的绑定
$0.textField.reactive.text <~ self.verifyCode.producer.take(until: cell.reactive.prepareForReuse)
以下代码用来限制输入的字符数,开发者也可以再次限制输入的内容,如手机号码校验等
.observeValues{ [weak self] in self?.verifyCode.value = String($0.characters.prefix(6)) }
一切尽在代码中,文笔太差就不多废话了
在需要多个请求都返回时才处理后续流程这种情况下,如果不使用ReactiveCocoa,需要保留很多状态
使用ReactiveCocoa就简单多了,贴代码
func requestPropertyValue() -> SignalProducer<PropertyValueModel, RequestError> { return SignalProducer { (observer, lifeTime) in let params = ["module" : PropertyValueService.ModuleProperty.prod.rawValue] let requestTask = PropertyValueService() .request( params, transform: { var result = [String : String]() $0["data"].arrayValue.forEach { result[$0["mappingName"].stringValue] = $0["propName"].stringValue } return PropertyValueModel(propMap: result) }, completionHandler: { if $0.isSuccess { observer.send(value: $0.value!) observer.sendCompleted() } else { observer.send(error: $0.error as! RequestError) } }) lifeTime += AnyDisposable { requestTask?.cancel() } } } func requestProductCustomerNo() -> SignalProducer<String, NoError> { return SignalProducer { observer, _ in ProductNoService() .request( nil, transform: { $0["prodCustomNo"].stringValue }, completionHandler: { observer.send(value: $0.isSuccess ? $0.value! : "") observer.sendCompleted() }) } } func requestCustomerNoAndPropertyValue() { let customerNoProducer = requestProductCustomerNo().promoteError(RequestError.self) let propProducer = requestPropertyValue() customerNoProducer .combineLatest(with: propProducer) .observe(on: UIScheduler()) .on(starting: { [weak self] _ in if let strongSelf = self { strongSelf.showLoadingOnView(strongSelf.view) } }) .startWithSignal { signal, _ in signal.observeResult { [weak self] result in if let strongSelf = self { strongSelf.hideLoadingForView(strongSelf.view) if let value = result.value { strongSelf.customNo.value = value.0 strongSelf.generatedProdNo = value.0 strongSelf.tableView.reloadData() } } } } }
combineLatest函数使多个信号都响应时才通知,不需要保留任何临时状态就优雅的解决了这种问题
阅读全文
0 0
- ReactiveCocoa6.0的开发指北
- web2.0的开发
- XOOPS NewBB2.0 的开发
- VC6.0的开发环境
- liferay7.0开发的二三坑
- 敏捷开发宣言--《敏捷开发的艺术》读书笔记0
- 开发过程的敏捷开发
- Spark开发-SparkSql的开发
- AS3.0(ActionScript3.0)的开发工具
- web2.0开发用到的一些笔记
- Struts2.0: Web开发的精灵框架
- Mashup:Web2.0开发的助推器
- WinCE5.0开发环境的建立
- 软件开发组织的web2.0模式
- 软件开发组织的web2.0模式
- Struts2.0: Web开发的精灵框架
- Struts2.0: Web开发的精灵框架
- Struts2.0: Web开发的精灵框架
- Elasticsearch内存分配设置详解
- 感受
- css水平垂直居中布局
- Android studio导入项目无法运行。keystore问题。
- HTTP断点续传(分块传输)
- ReactiveCocoa6.0的开发指北
- Spark入门实战系列--9.Spark GraphX介绍及实例
- Linux top命令的用法详细详解
- vue运行npm run dev出错:node build/dev-server.js module.js:487
- python openpyxl实现添加读写操作(主要针对xlsx格式)
- VMware安装linux(read hat)
- Python中的matplotlib用法总结
- MFC随笔---VS2015创建MFC项目
- 最后一个单词的长度 -LintCode