[트러블 슈팅] 비동기 작업

z-wook·2023년 11월 12일
0

트러블 슈팅

목록 보기
5/6
post-thumbnail

문제 상황

  • 인기스타 Section에서 받은 찜 개수가 많은 순서대로 나오지 않는 문제 발생

문제 상황까지의 순서

  1. Firbase에서 찜 받은 유저 리스트를 받아온다.
  2. 찜 받은 개수가 많은 순서대로 정렬한다.
  3. 정렬된 리스트에서 유저 정보를 요청한다.
  4. 받은 데이터를 리스트에 추가한다.

문제 상황의 코드

func groupTaskForFetchUsers(uidList: [String]) async -> [UserInfo] {
	let datas = await withTaskGroup(of: UserInfo?.self) { group in
		for uid in uidList {
			group.addTask {
				let data = await self.fetchUserInfo(uuid: uid)
				if let error = data.error {
					CommonUtil.print(output: "error: \(error.localizedDescription)")
					return nil
				}
				return data.result
			}
		}
		var dataList: [UserInfo?] = []
		for await userInfo in group {
			dataList.append(userInfo)
		}
		return dataList.compactMap { $0 }
	}
	return datas
}

원인 추론

유저 리스트에서 순서대로 요청은 하지만 요청한 순서대로 데이터를 받는다는 보장이 없기 때문에 순서가 뒤섞이는 문제가 발생한다.


수정 및 조치

  • 유저 리스트에서 순서대로 요청한 후 요청한 순서대로 리스트에 넣어주는 작업을 해야 한다.
  • index를 알기 위해 enumerated를 사용한다.

⭐️ 문제 해결 ⭐️

func groupTaskForFetchUsers(uidList: [String]) async -> [UserInfo] {
	let datas = await withTaskGroup(of: (Int, UserInfo?).self) { group in
		for (index, uid) in uidList.enumerated() {
			group.addTask {
				let data = await self.fetchUserInfo(uuid: uid)
				if let error = data.error {
					CommonUtil.print(output: "error: \(error.localizedDescription)")
					return (index, nil)
				}
				return (index, data.result)
			}
		}
		var dataList: [UserInfo?] = Array(repeating: nil, count: uidList.count)
		for await (index, userInfo) in group {
			dataList[index] = userInfo
		}
		return dataList.compactMap { $0 }
	}
	return datas
}


문제 해결 후 받은 찜이 많은 순서대로 나오는 것을 볼 수 있습니다.

profile
🍎 iOS Developer

0개의 댓글