swift3で同期処理がうまくいかない
画像処理や動画処理ってやたら処理が重いなと思って処理してる間はインジケーターかもしくは処理に時間がかかる旨をユーザーに伝えたいと思いSwift3のGCD周りを調べ実装してみたんですけど中々うまくいきませんでした。
下記のようにqueue
を使って画像処理するから時間がかかるということをアラートかインジケーターでお知らせしてから、画像処理を加えたかったんですけど、こうしても結局画像の処理が終わってViewにレイアウトが描画された後にアラートやインジケーターが実行されてしまいました。多分、僕の使い方が悪いだけですよね
// グループを生成
let group = DispatchGroup()
let queue1 = DispatchQueue(label: "jp.classmethod.app.queue1")
// キューとグループを紐付ける
queue1.async(group: group) {
print("画像処理するから時間がかかるということをアラートかインジケーターで実装")
}
// タスクが全て完了したらメインスレッド上で処理を実行する
group.notify(queue: DispatchQueue.main) {
print("画像処理入りま〜す")
}
代替案
ということで、不恰好な逃げ策としてこちらのサイトを参考にさせていただきました。
print( "現在" )
print( "画像処理するから時間がかかるということをアラートかインジケーターで実装" )
let dispatchTime: DispatchTime = DispatchTime.now() + Double(Int64(1.0 * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC)
DispatchQueue.main.asyncAfter(deadline: dispatchTime, execute: {
print( "画像処理入りま〜す" )
})
上記のように実装することで、とりあえず同期処理的な動きを実現させることができました。「A」という処理が終わった後に「B」を実行みたいな本当の同期処理的を実現させには多少工夫をしなきゃいけませけど、とりあえず、なんでもいいから「A」の後に「B」じゃあ!って感じには使えそうでした。
もっと賢い方法があれば教えてください…orz
参考
[Swift 3] Swift 3時代のGCDの基本的な使い方
【Swift】Swiftでの遅延処理の実装(Swift3の場合も追記)