ホーム

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

Pocket
LinkedIn にシェア

エンジニアにおすすめできる本

Card image cap
リーダブルコード

より良いコードを書くためのシンプルで実践的なテクニック

Card image cap
Webを支える技術

HTTP,URI,HTML,そしてREST

Card image cap
誰でもPythonで作れる

儲かるAIとソフトウェアの作り方

Card image cap
プログラマが知るべき97のこと

現場で使える実践哲学のマスターピース

Card image cap
情熱プログラマー

時代を超えて。ソフトウェア開発者の幸せな生き方

Card image cap
アジャイルサムライ

プログラミング達人開発者への道

Card image cap
Rubyを作った男 まつもとゆきひろ

コードの世界 スーパー・プログラマになる14の思考法

ご提供 sponsor
 

Meee!(ミー)は、ビジネスからプライベート利用まで、個人のスキルを気軽に売り買いできるスキルマーケットです。カテゴリや居住地から、検索することが可能です。

 

ランゲージエクスチェンジは、ネイティブスピーカーと気軽にマッチングできる言語交換プラットフォームです。あなたの地元に住む外国人を探したり、留学や海外移住の前に、現地のネイティブスピーカーと繋がることもできます!

宣伝
 

りょすけトークchは、仕事や私生活をより豊にするYouTubeチャンネルです。文献(本、映画、論文)から役に立つ情報をまとめ、生涯にわたり役に立つ哲学をお届けしています。是非、チャンネル登録してみてね

-ホーム

Copyright© offブログ! , 2021 All Rights Reserved Powered by AFFINGER5.