はじめに
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
配列に格納し、myLikeCount
とmyPostCount
に代入することで、下記の画像のようにいいね数とポスト数を同時に画面に表示することができました。
async let
を使用することで、並列処理を行うことでいいね数とポスト数を取得するスピードも早くなりました。
参考文献