我们这里介绍常用的如UIButton、UITextFiled、UITextView、UILabel等控件的RX扩展以及RX网络请求的处理,使用起来极为方便,作为程序员应该拥有接纳新事物的本能。
一、UIButton
1、初始化button
let button = UIButton.init(type: UIButton.ButtonType.custom)
button.frame = CGRect(x:100, y:350, width:200, height:30)
button.setTitle("点我", for: .normal)
button.backgroundColor = UIColor.orange
self.view.addSubview(button)
2、两种绑定事件的方式
//1、subscribe调用next的事件
button.rx.tap.subscribe(onNext: { [weak self] in
self?.showMessage("按钮被点击")
}).disposed(by: disposeBag)
//2、绑定事件
button.rx.tap.bind { [weak self] in
self?.showMessage("按钮被点击")
}.disposed(by: disposeBag)
3、消息调用
//显示消息提示框
func showMessage(_ text: String) {
let alertController = UIAlertController(title: text, message: nil, preferredStyle: .alert)
let cancelAction = UIAlertAction(title: "确定", style: .cancel, handler: nil)
alertController.addAction(cancelAction)
self.present(alertController, animated: true, completion: nil)
}
二、UILabel
1、初始化label
let label = UILabel(frame:CGRect(x:20, y:40, width:300, height:100))
self.view.addSubview(label)
2、创建定时器,并将数据绑定到label上
//创建一个计时器(每0.1秒发送一个索引数)
let timer1 = Observable<Int>.interval(0.1, scheduler: MainScheduler.instance)
//将已过去的时间格式化成想要的字符串,并绑定到label上
timer.map{ String(format: "%0.2d:%0.2d.%0.1d",
arguments: [($0 / 600) % 600, ($0 % 600 ) / 10, $0 % 10]) }
.bind(to: label.rx.text).
disposed(by: disposeBag)
三、UITextField
1、初始化UITextField
let textField = UITextField(frame: CGRect(x:10, y:180, width:200, height:30))
textField.borderStyle = UITextField.BorderStyle.roundedRect
self.view.addSubview(textField)
2、监听UITextField的变化
如果是原生方法就需要设置协议了。
textField.rx.text.orEmpty.asObservable().subscribe(onNext: { (str) in
print("~~~~~~~~~~~~\(str)")
}).disposed(by: disposeBag)
//还可以这么写
textField.rx.text.orEmpty.asObservable().subscribe(onNext: {
print("$0")
}).disposed(by: disposeBag)
四、NSURLSession网络请求的处理
首先创建基本数据:
let urlString = "https://www.douban.com/j/app/radio/channels"
let url = URL(string:urlString)
//创建请求对象
let request = URLRequest(url: url!)
1、普通网络请求
let sess = URLSession.shared
let request1:URLRequest = NSURLRequest.init(url: url!) as URLRequest
let task = sess.dataTask(with: request1) { (data, res, error) in
let json = try? JSONSerialization.jsonObject(with: data!, options: .allowFragments)
as! [String: Any]
print("~~~~~~~~~\(json)")
}
task.resume()//开始执行
2、RX订阅后json处理的网络请求
URLSession.shared.rx.data(request: request).subscribe(onNext: {
data in
let json = try? JSONSerialization.jsonObject(with: data, options: .allowFragments)
as! [String: Any]
print("---再订阅后转换成json数据 请求成功!返回的如下数据 ---")
print(json!)
}).disposed(by: disposeBag)
3、RX订阅后Json处理的网络请求
URLSession.shared.rx.data(request: request)
.map {
try JSONSerialization.jsonObject(with: $0, options: .allowFragments)
as! [String: Any]
}
.subscribe(onNext: {
data in
print("---再订阅前转换成json数据 请求成功!返回的如下数据 ---")
print(data)
}).disposed(by: disposeBag)
4、RX自带Json网络请求
URLSession.shared.rx.json(request: request).subscribe(onNext: { (data) in
let json = data as! [String: Any]
print("---RX 自带的JSON处理 请求成功!返回的如下数据 ---")
print(json)
}).disposed(by: disposeBag)
通过比较,我们可以发现,使用RXSwift更加简洁,并且使用RX自带的Json处理数据,更加的方便,真的是贴心小棉袄了。
网友评论