8
7

複数の非同期処理を並列に実行し、非同期関数の結果が返されるまで待機する!~Swift Concurrency: async let~

Last updated at Posted at 2024-08-10

はじめに

SNSアプリでユーザーのプロフィールを表示する画面が表示されたとき、ポスト数といいね数が同時に取得されるのではなく、下記の画像のように先にいいね数取得し表示し、ポスト数を取得後表示するようにタイムラグがあるのは不自然ですね。
それを解決するためasync letを用い、いいね数取得とポスト数を取得を並列して行い、2つとも取得できるまで待機し、同時に画面を更新するという実装にアップデートした方法を紹介したいと思います!

async let 使用前

func updateMyCounts(userID: String) {
        myPostCount = ""
        myLikeCount = ""
        Task {
            do {
                let likeCount = try await DataService.instance.sumLikePost(userID: userID)
                myLikeCount = String(likeCount)
                let postCount = try await DataService.instance.sumUserPost(userID: userID)
                myPostCount = String(postCount)
            } catch {
                print("Count Error")
            }
        }
    }

sumLikePostメソッドで取得したいいね数をmyLikeCountStringに代入し、画面にいいね数を表示した後、sumUserPostメソッドが実行される直列処理になってしまっているので、いいね数が画面に表示された後、ポスト数が画面に表示されるというタイムラグが発生してしまっています。

async let 使用後

func updateMyCounts(userID: String) {
        myPostCount = ""
        myLikeCount = ""
        Task {
            do {
                async let likeCount = try await DataService.instance.sumLikePost(userID: userID)
                async let postCount = try await DataService.instance.sumUserPost(userID: userID)
                let count = try await [likeCount, postCount]
                (myLikeCount, myPostCount) = (String(count[0]), String(count[1]))
            } catch {
                print("MyCount Error")
            }
        }
    }

上記のコードではasync letを使用することで、2つのメソッドの呼び出しで、前の呼び出しが完了するのを待たずに並列実行されます。
awaitで2つの非同期関数の結果が返されるまで待機し、2つとも取得できたらcount配列に格納し、myLikeCountmyPostCountに代入することで、下記の画像のようにいいね数とポスト数を同時に画面に表示することができました。
async letを使用することで、並列処理を行うことでいいね数とポスト数を取得するスピードも早くなりました。

参考文献

8
7
0

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
8
7