RXSwift的UI控件扩展以及网络请求

2019-12-31  本文已影响0人  woniu

我们这里介绍常用的如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处理数据,更加的方便,真的是贴心小棉袄了。

上一篇 下一篇

猜你喜欢

热点阅读