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の場合も追記)

藤沢瞭介(Ryosuke Hujisawa)
  • りょすけと申します。18歳からプログラミングをはじめ、今はフロントエンドでReactを書いたり、AIの勉強を頑張っています。off.tokyoでは、ハイテクやガジェット、それからプログラミングに関する情報まで、エンジニアに役立つ情報を日々発信しています!

未整理記事