Github URL: ReactiveX/RxSwift
API RxSwift supported operators
Podfile
use_frameworks!
target 'Project_Name' do
pod 'RxSwift', '~> 2.0'
pod 'RxCocoa', '~> 2.0'
end
★ 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のタップイベントをバインド
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を指定して監視する
let disposeBag = DisposeBag()
@IBOutlet weak var button: UIButton!
button.rx_controlEvent(UIControlEvents.TouchUpInside)
.subscribeNext { _ in
print("button TouchUpInside!")
}
.addDisposableTo(disposeBag)
let disposeBag = DisposeBag()
@IBOutlet weak var slider: UISlider!
// valueChangedのイベントで呼ばれる
slider.rx_value.asObservable()
.subscribeNext { value in
print("Slider.value = \(value)")
}
.addDisposableTo(disposeBag)
let disposeBag = DisposeBag()
let tapGesture = UITapGestureRecognizer()
tapGesture.rx_event
.map { _ in }
.subscribeNext {
print("Tap!")
}
.addDisposableTo(disposeBag)
view.addGestureRecognizer(tapGesture)
let disposeBag = DisposeBag()
@IBOutlet weak var tableView: UITableView!
// contentOffsetの変化を取得する
tableView.rx_contentOffset
.subscribeNext { [weak self] contentOffset in
print("contentOffset = \(contentOffset)")
}
.addDisposableTo(disposeBag)
★ 通知を登録する
// キーボードが表示される前の通知(removeはしなくてもよい)
NSNotificationCenter.defaultCenter().rx_notification(UIKeyboardWillShowNotification, object: nil)
.subscribeNext { [ unowned self] notification in
print("rx_notification : \(notification)")
}
.addDisposableTo(disposeBag)
★ 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 送られたデータを受け取る処理