LoginSignup
0
1

More than 5 years have passed since last update.

Swiftで波紋の呼吸

Last updated at Posted at 2017-06-30

永遠の(プログラマ)生命を求める者が「Hello World」して「Get Wild」した場合、最終的に「The World ~時よ止まれ/そして時は動き出す~」に至るのは自然な流れであり、ある種の人間賛歌とも言えるだろう。

しかし思うところあり、そこは敢えて後進に譲るとして、触れないでおきたい。
代わりに今回は実践的な「波紋の呼吸の訓練法」を紹介しよう。

トレーニングメニュー
- 1秒間に10回の呼吸(10 breaths / 1 sec)
- 1分間息を吸い続け、その後吐き続ける(Continue to breathe / 1 min)
- 最後にグラスのワインを溢さず蛙をメメタァ(me-meta to frogs)

基本的には上記エクササイズ(物理)を日々欠かさず行う事が肝要だが、冷静にQiita的な見地に立つと、これが有益な情報であるかどうか、若干の疑問が残る。

そこで今回はとかく忙しい現代人の為に、上記のカリキュラムをSwift(Playgrounds)を用い、同期・非同期を織り交ぜて効果的に同時実行可能なコードを紹介して筆を折りたい。

HamonTrainingPlayground
//: HamonTrainingPlayground

import UIKit

// 波紋初心者向けとして、手始めに2分間(120s)実施する。
// (最終的には10分間)
let executionTime = 120

let op1 = BlockOperation {
    let s = 1
    Thread.current.name = "1秒間に\(s)回の呼吸"

    for i in 0 ..< executionTime / s {
        print(Thread.current.description + ": \(i + 1)回目")
        Thread.sleep(forTimeInterval: 1 / Double(s))
    }
}
let op2 = BlockOperation {
    let m = 1, s = m * 60
    Thread.current.name = "\(m)分間息を吸い続け、その後吐き続ける"
    for i in 0 ..< executionTime / s {
        print(Thread.current.description + ": \(i + 1)回目")
        Thread.sleep(forTimeInterval: Double(s))
    }
}

let op3 = BlockOperation {
    Thread.current.name = "グラスのワインを溢さず蛙をメメタァ"
    print(Thread.current.description)
}

op3.addDependency(op1)
op3.addDependency(op2)

let queue = OperationQueue()

queue.addOperation(op1)
queue.addOperation(op2)
queue.addOperation(op3)

queue.waitUntilAllOperationsAreFinished()

実行結果

実行例(抜粋)
<NSThread: 0x60800026c940>{number = 4, name = 1秒間に1回の呼吸}: 1回目
<NSThread: 0x600000267880>{number = 5, name = 1分間息を吸い続け、その後吐き続ける}: 1回目
<NSThread: 0x60800026c940>{number = 4, name = 1秒間に1回の呼吸}: 2回目
<NSThread: 0x60800026c940>{number = 4, name = 1秒間に1回の呼吸}: 3回目
<NSThread: 0x60800026c940>{number = 4, name = 1秒間に1回の呼吸}: 4回目
<NSThread: 0x60800026c940>{number = 4, name = 1秒間に1回の呼吸}: 5回目
// 中略
<NSThread: 0x60800026c940>{number = 4, name = 1秒間に1回の呼吸}: 55回目
<NSThread: 0x60800026c940>{number = 4, name = 1秒間に1回の呼吸}: 56回目
<NSThread: 0x60800026c940>{number = 4, name = 1秒間に1回の呼吸}: 57回目
<NSThread: 0x60800026c940>{number = 4, name = 1秒間に1回の呼吸}: 58回目
<NSThread: 0x600000267880>{number = 5, name = 1分間息を吸い続け、その後吐き続ける}: 2回目
<NSThread: 0x60800026c940>{number = 4, name = 1秒間に1回の呼吸}: 59回目
<NSThread: 0x60800026c940>{number = 4, name = 1秒間に1回の呼吸}: 60回目
// 中略
<NSThread: 0x60800026c940>{number = 4, name = 1秒間に1回の呼吸}: 115回目
<NSThread: 0x60800026c940>{number = 4, name = 1秒間に1回の呼吸}: 116回目
<NSThread: 0x60800026c940>{number = 4, name = 1秒間に1回の呼吸}: 117回目
<NSThread: 0x60800026c940>{number = 4, name = 1秒間に1回の呼吸}: 118回目
<NSThread: 0x60800026c940>{number = 4, name = 1秒間に1回の呼吸}: 119回目
<NSThread: 0x60800026c940>{number = 4, name = 1秒間に1回の呼吸}: 120回目
<NSThread: 0x608000270b40>{number = 6, name = グラスのワインを溢さず蛙をメメタァ}

バージョン情報

Swift:3.1
Xcode:8.3.3 (Swift Playgrounds)

ソースコード

0
1
0

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
0
1