質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

1922閲覧

Swift Timerで0.01秒ごとに確実に処理をしたいのですが

mitci

総合スコア37

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2017/10/22 11:23

###前提・実現したいこと
SwiftでMPMusicPlayerControllercurrentPlaybackTimeを参照して0.01秒ごとに mm:ss.ff というフォーマットの文字列を発行して、あらかじめその時間タグをキーにした辞書から値を引き出すという処理をさせたいのですが、
timerの感覚が短いせいか、
ときどき、ちゃんと取り出してくれないことがあります。

コードは以下の通りです。

swift

1var dict = ["00:01.12":"最初の文字列", "00:13.52":"2番目の文字列", "00:32.56":"3番目の文字列"] 2//実際には複数の様々な時間と文字列の入った辞書を使用します。 3var timeTag = "--:--.--" 4 5override func viewDidLoad() { 6 super.viewDidLoad() 7 timer = Timer.scheduledTimer(timeInterval: 0.002, target: self, selector: #selector(timeTagAndLabel 8Update), userInfo: nil, repeats: true) 9//0.002秒にしているのは0.01よりも確実にその時間の時点で処理をしたいためです 10} 11 12func timeTagAndLabelUpdate() { 13 let min = Int(player.currentPlaybackTime) / 60 14 let sec = Int(player.currentPlaybackTime) % 60 15 currentTime = String(format: "%02d:%02d", min, sec) 16 let integerCurrentTime = Int(player.currentPlaybackTime) 17 let currentTimeOnlydecimal = player.currentPlaybackTime - Double(integerCurrentTime) 18 let decimal = Int(currentTimeOnlydecimal * 100) 19 decimalTime = String(format: ".%02d", decimal) 20 timeTag = currentTime + decimalTime 21 //これで"mm:ss.ff"のタイムタグを発行します 22 if timeTag != lastTimeTag, let label = dict[timeTag] { 23 let animation = CATransition() 24 animation.type = kCATransitionFade 25 animation.duration = 0.2 26 flowLabel.layer.add(animation, forKey: nil) 27 flowLyricsLabel.text = label 28 lastTimeTag = timeTag 29 //ラベルの文字列を入れ替える時にアニメーションをしたいので、lastTimeTagを代入しておきます 30 } 31} 32

取り出しができない頻度は50回に1度くらいと気にしなければ気にならない程度ですが、
気になってしまいました・・・

また、表示する時にアニメーションしてほしいのですが、
実際のところ、0.01秒単位で辞書キーと照らし合わせるというよりも、
最初のキーである"00:01.12"から次のキー"00:13.52"までの秒数であれば何秒だとしても最初のキーで取り出した値"最初の文字列"がアニメーションで表示される処理ができればいいな、と思っていますが、"00:01.12"というのは文字列なので普通の<やら>という比較演算子は使えないので、困っています。
また、表示する時は必ずアニメーションをしてほしいというのもちょっと厄介にさせているかな、と考えています。

###試したこと
timerが細かすぎて、(使用している実機がiPad mini2という古い機種ということもあり)時々処理落ちしているというのはわかるのですが、
"00:01.12"から"00:13.52"まで という範囲指定ができず、
またその範囲であるたびにラベルを更新するという処理にしてしまうとアニメーションもtimerの繰り返し回数だけ連続して実行されておかしな見た目になってしまうため、困っています。

###補足情報(言語/FW/ツール等のバージョンなど)
swift3 Xcode8

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

"00:01.12"というのは文字列なので普通の<やら>という比較演算子は使えないので、困っています。

使えますよ。

swift

1print("00:01.12" < "00:01.13") //=> true 2print("00:01.12" > "00:01.13") //=> false

投稿2017/10/23 00:57

fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mitci

2017/10/24 10:08

本当だ・・・ すいません、普通に使えるようですね・・・ これを利用して、確実に処理ができるように、ちょっと考えてみます
guest

0

比較演算子を駆使してどうにか処理を完成させました。

投稿2017/11/05 11:16

mitci

総合スコア37

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問