美文网首页
RXSwift的UI控件扩展以及网络请求

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

作者: woniu | 来源:发表于2019-12-31 17:23 被阅读0次

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

    相关文章

      网友评论

          本文标题:RXSwift的UI控件扩展以及网络请求

          本文链接:https://www.haomeiwen.com/subject/jzfioctx.html