LoginSignup
1
2

More than 5 years have passed since last update.

swift3で同期処理がうまくいかない

Last updated at Posted at 2017-06-01

画像処理や動画処理ってやたら処理が重いなと思って処理してる間はインジケーターかもしくは処理に時間がかかる旨をユーザーに伝えたいと思い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の場合も追記)
swift3で同期処理がうまくいかない

1
2
3

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