LoginSignup
7

More than 5 years have passed since last update.

RxSwift スレッドクイズ (問題編)

Posted at

※ この記事は問題編です。本編である解説編と合わせてご覧ください。

この記事何?

  • RxSwift Advent Calendar 2016の22日目の記事の前置きみたいなものです。
  • クイズを通して、マルチスレッド環境下におけるRxSwiftの挙動と、observeOnsubscribeOnなどのオペレーターや DriverControlEvent などのスレッド周りの性質を解説していきます
  • この記事自体には解答・解説は含みません。後編かつ本編である解説編をご覧ください。

クイズについて

  • 以下のクイズは、イベントがどのスレッドにて流れてくるかを当てるクイズです。
  • メインスレッドじゃないスレッドをまとめて「バックグラウンドスレッド」と呼びます。
  • 特に明示的に指定されていなければメインスレッドだと思ってください。つまりトップレベルはメインスレッドです。
  • .addDisposableTo(disposeBag) は省略してます。

第1問

(1)のmapにはどのスレッドでイベントが流れてくるでしょう?

第1問
Observable.of(1, 2, 3)
    .map { $0 * 2 } // (1)
    .subscribe()

第2問

(1)のmapにはどのスレッドでイベントが流れてくるでしょう?

第2問
let o = Observable.of(1, 2, 3)
    .map { $0 * 2 } // (1)

backgroundQueue.async {
    o.subscribe() // バックグラウンドでsubscribe
}

第3問

(1)のmapにはどのスレッドでイベントが流れてくるでしょう?

第3問
let o = Observable.of(1, 2, 3)
    .map { $0 * 2 } // (1)
    .publish()

o.subscribe()

backgroundQueue.async {
    o.connect()
}

第4問

(1)のmapにはどのスレッドでイベントが流れてくるでしょう?

第4問
let o = Observable.of(1, 2, 3)
    .map { $0 * 2 } // (1)
    .share()

backgroundQueue.async {
    // バックグラウンドスレッド
    o.subscribe()
    mainQueue.async {
        // メインスレッド
        o.subscribe()
    }
}

第5問

(1)のmapにはどのスレッドでイベントが流れてくるでしょう?

第5問
let o = Observable.of(1, 2, 3, scheduler: mainScheduler)
    .map { $0 * 2 } // (1)

backgroundQueue.async {
    o.subscribe()
}

第6問

(1), (2) のmapにはどのスレッドでイベントが流れてくるでしょう?

第6問
Observable.of(1, 2, 3)
    .map { $0 * 2 }  // (1)
    .observeOn(backgroundScheduler)
    .map { $0 * 2 } // (2)
    .subscribe()

第7問

(1), (2) のmapにはどのスレッドでイベントが流れてくるでしょう?

第7問
Observable.of(1, 2, 3)
    .map { $0 * 2 } // (1)
    .subscribeOn(backgroundScheduler)
    .map { $0 * 2 } // (2)
    .subscribe()

第8問

(1), (2) のmapにはどのスレッドでイベントが流れてくるでしょう?

第8問
Observable.of(1, 2, 3, scheduler: backgroundScheduler)
    .map { $0 * 2 } // (1)
    .observeOn(mainScheduler)
    .map { $0 * 2 } // (2)
    .subscribe()

第9問

(1), (2) のmapにはどのスレッドでイベントが流れてくるでしょう?

第9問
Observable.of(1, 2, 3, scheduler: mainScheduler)
    .map { $0 * 2 } // (1)
    .subscribeOn(backgroundScheduler)
    .map { $0 * 2 } // (2)
    .subscribe()

第10問

(1), (2) のmapにはどのスレッドでイベントが流れてくるでしょう?

第10問
let o = Observable.of(1, 2, 3)

ControlEvent<Int>(events: o)
    .map { $0 * 2 } // (1)
    .subscribeOn(backgroundScheduler)
    .map { $0 * 2 } // (2)
    .subscribe()

第11問

(1), (2) のmapにはどのスレッドでイベントが流れてくるでしょう?

第11問
let o = Observable.of(1, 2, 3, scheduler: backgroundScheduler)

ControlEvent<Int>(events: o)
    .map { $0 * 2 } // (1)
    .subscribeOn(backgroundScheduler)
    .map { $0 * 2 } // (2)
    .subscribe()

第12問

(1) のmapにはどのスレッドでイベントが流れてくるでしょう?

第12問
let d = Observable.of(1, 2, 3)
    .asDriver(onErrorJustReturn: 0)
    .map { $0 * 2 } // (1)

backgroundQueue.async {
    d.drive()
}

第13問

(1) のmapにはどのスレッドでイベントが流れてくるでしょう?

第13問
Observable.of(1, 2, 3, scheduler: backgroundScheduler)
    .asDriver(onErrorJustReturn: 0)
    .map { $0 * 2 } // (1)
    .drive()

解答・解説編

こちらへ ↓
RxSwiftスレッドクイズ(解答・解説編)

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7