###前提・実現したいこと
恐れ入ります。
Swift3を用いてカウントダウンをするアプリを作っています。
別スレッドでタイマーを用いてカウントダウン処理を行いメインスレッドではsemaphore.wait()を用いて処理をロックし、カウントダウンが終了すると別スレッドでsemaphore.signal()でロックを解除し、メインスレッドを再開させることを考えていました。
しかし、別スレッドで処理されるはずのタイマー上の処理は動作せず処理全体がロックする状態となってしまいました。
おそらく、タイマーの処理が別スレッドで動作していないのが原因かと考えています。
実装は以下の通りです。
タイマーを別スレッドで動作させる方法はありますでしょうか。
お手数ですがご教示お願い致します。
###該当のソースコード
swift
1import UIKit 2 3class ViewController: UIViewController { 4 5 var countTime: Double = 10.0 6 let semaphoreCountDown = DispatchSemaphore(value: 0) //セマフォを用意する 7 8 override func viewDidLoad() { 9 10 // タイマー生成 11 let timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(self.countDown), userInfo: nil, repeats: true) 12 // 別スレッドでタイマーを処理 13 RunLoop.current.add(timer, forMode: RunLoopMode.commonModes) 14 15 debugPrint("メインスレッド停止") 16 semaphoreCountDown.wait() 17 debugPrint("メインスレッド再開") 18 19 } 20 21 func countDown(){ 22 // カウントダウンの処理. 23 countTime = countTime - 1 24 25 // セマフォを解除. 26 if ( 0.0 >= countTime ) { semaphoreCountDown.signal() } 27 }
###試したこと
DispatchQueue.global().async使って以下のように組んでみましたが同様に処理全体がロックしました。
var timer = Timer()
// スレッド生成
DispatchQueue.global().async{
// タイマー生成
timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(self.countDown), userInfo: nil, repeats: true)
}
debugPrint("メインスレッド停止")
semaphoreCountDown.wait()
debugPrint("メインスレッド再開")
###補足情報(言語/FW/ツール等のバージョンなど)
swift3, iOS10以上
回答1件
あなたの回答
tips
プレビュー