First of all, there are already adapters to convert Iterable to Observable: "from" function.
Seconds, iterator wont return control, so your Sleep and unsubscribe wont be called. You need to execute subscription operation in a dedicated thread "subscribeOn(NewThreadScheduler())"
def getIterator: Iterator[String] = {
def fib(a: BigInt, b: BigInt): Stream[BigInt] = a #:: fib(b, a + b)
fib(1, 1).iterator.map{bi =>
Thread.sleep(1000)
s"next fibonacci: ${bi}"
}
}
val sub = Observable.from(getIterator.toIterable)
.subscribeOn(NewThreadScheduler())
.subscribe(println(_))
readLine()
sub.unsubscribe()
println("fib complete")
readLine()