Skip to content

Instantly share code, notes, and snippets.

@KentarouKanno
Last active May 29, 2022 13:25
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save KentarouKanno/2feb5fd162cd0b66e26ed883ebccf6fe to your computer and use it in GitHub Desktop.
Save KentarouKanno/2feb5fd162cd0b66e26ed883ebccf6fe to your computer and use it in GitHub Desktop.
RxSwift UIKit

RxSwift UIKit

Github URL: ReactiveX/RxSwift
API RxSwift supported operators

Podfile

use_frameworks!

target 'Project_Name' do
    pod 'RxSwift',    '~> 2.0'
    pod 'RxCocoa',    '~> 2.0'

end

UITextField

★ UILabelとUITextFieldをバインドする

import UIKit
import RxCocoa
import RxSwift

let disposeBag = DisposeBag()

class ViewController: UIViewController {
    
    @IBOutlet weak var label: UILabel!
    @IBOutlet weak var textField: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()
        
        textField.rx_text
        .map { ("[\($0)]") }
        .bindTo(label.rx_text)
        .addDisposableTo(disposeBag)
        
        // 以下でも同じ事ができる
        textField.rx_text
            .subscribeNext {[weak self] text in
                self?.label.text = text
            }.addDisposableTo(disposeBag)
    }
}

★ UITextFieldの入力を監視する

textField.rx_text
    .subscribeNext { text in
        print(text)
    }.addDisposableTo(disposeBag)

UIButton

★ UIButtonのタップイベントをバインド

let disposeBag = DisposeBag()

@IBOutlet weak var button: UIButton!

button.rx_tap
    .subscribeNext { [unowned self] _ in
        self.buttonPushed()
    }.addDisposableTo(disposeBag)
    
func buttonPushed() {
    print("abc")
}

★ フラグがtrueの場合だけボタンのアクションを実行する

let disposeBag = DisposeBag()

@IBOutlet weak var button: UIButton!
var flag = false

button.rx_tap
    .filter {[unowned self] in
        self.flag
    }
    .subscribeNext {
        print("did tap")
    }
    .addDisposableTo(disposeBag)

★ UIButtonの複数押下を防ぐ

let disposeBag = DisposeBag()

@IBOutlet weak var button: UIButton!

// 1.0秒間内のタップをフィルターする
button.rx_tap
    .throttle(1.0, scheduler: MainScheduler.instance)
    .subscribeNext { _ in
        print("Hello World")
    }
    .addDisposableTo(disposeBag)

★ UITextFieldとUIButtonをバインドして文字数が6文字異常の場合Buttonを有効にする

let disposeBag = DisposeBag()

@IBOutlet weak var textField: UITextField!
@IBOutlet weak var sendButton: UIButton!

// bindTo使用
textField.rx_text
    .map { $0.characters.count > 5 }
    .bindTo(sendButton.rx_enabled)
    .addDisposableTo(disposeBag)


textField.rx_text
    .subscribeNext { [weak self] text in
        self?.sendButton.enabled = text.characters.count > 5
    }
    .addDisposableTo(disposeBag)

UIControlEvents

★ UIControlEventsを指定して監視する

let disposeBag = DisposeBag()

@IBOutlet weak var button: UIButton!

button.rx_controlEvent(UIControlEvents.TouchUpInside)
    .subscribeNext { _ in
        print("button TouchUpInside!")
    }
    .addDisposableTo(disposeBag)

UIControl

let disposeBag = DisposeBag()

@IBOutlet weak var slider: UISlider!

// valueChangedのイベントで呼ばれる
slider.rx_value.asObservable()
    .subscribeNext { value in
        print("Slider.value = \(value)")
    }
    .addDisposableTo(disposeBag)

UIGestureRecognizer

let disposeBag = DisposeBag()

let tapGesture = UITapGestureRecognizer()

tapGesture.rx_event
    .map { _ in }
    .subscribeNext {
        print("Tap!")
    }
    .addDisposableTo(disposeBag)

view.addGestureRecognizer(tapGesture)

UIScrollView

let disposeBag = DisposeBag()

@IBOutlet weak var tableView: UITableView!

// contentOffsetの変化を取得する
tableView.rx_contentOffset
    .subscribeNext { [weak self] contentOffset in
        print("contentOffset = \(contentOffset)")
    }
    .addDisposableTo(disposeBag)

NSNotificationCenter

★ 通知を登録する

// キーボードが表示される前の通知(removeはしなくてもよい)
NSNotificationCenter.defaultCenter().rx_notification(UIKeyboardWillShowNotification, object: nil)
    .subscribeNext { [ unowned self] notification in
        print("rx_notification : \(notification)")
    }
    .addDisposableTo(disposeBag)

NSURLSession

rx_responseを使用した場合

let session = NSURLSession.sharedSession()
let url = NSURL(string: "http://apple.com")!
let request = NSURLRequest(URL: url)

session.rx_response(request).take(1)
    .subscribe { (value) in
        switch value {
        case .Next (let data) :
            print(NSString(data: data.0, encoding: NSUTF8StringEncoding))
        default: ()
        }
    }.addDisposableTo(disposeBag)
    

rx_dataを使用した場合

let session = NSURLSession.sharedSession()
let url = NSURL(string: "http://apple.com")!

session.rx_data(NSURLRequest(URL: url)).take(1)
    .subscribe{ value in
        switch value {
        case .Next (let data) :
            print(NSString(data: data, encoding: NSUTF8StringEncoding))
        default: ()
        }
        
    }.addDisposableTo(disposeBag)

rx_JSONを使用した場合

let session = NSURLSession.sharedSession()
let url = NSURL(string: "http://www.kentar0u.sakura.ne.jp/version.json")!

session.rx_JSON(NSURLRequest(URL: url)).take(1)
    .subscribe{ value in
        switch value {
        case .Next (let data) :
            let str = data["data_version"] as! String
            print(str)
            print(value)
        default: ()
        }
        
    }.addDisposableTo(disposeBag)

・subscribeNext (subscribe)
・onNext, onError, onComplete
・DisposeBag, Dispose
・Variable (値が変わればストリームがonNextされ、他で購読している場所も更新される。)
・asObservable
・addDisposableTo
・bindTo
・rx_tap, rx_text
・map, filter
・Hot, Cold

・subscribe 送られたデータを受け取る処理

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment