bugfix: 플레이리스트 데이터 정렬 문제 수정 by kybeen · Pull Request #293 · boostcampwm-2024/iOS06-molio
플레이리스트 상세화면의 플레이리스트 음악 순서가 불러올 때마다 일정하지 않고 뒤죽박죽인 상태
플레이리스트 화면의 음악 데이터는 다음과 같이 불러와진다.
func getMusic(with isrcs: [String]) async -> [MolioMusic] {
return await withTaskGroup(of: MolioMusic?.self) { group in
var musics: [MolioMusic] = []
for isrc in isrcs {
group.addTask {
return await getMusic(with: isrc)
}
}
for await music in group {
if let music {
musics.append(music)
}
}
return musics
}
}
Core Data에서 불러온 플레이리스트 음악 데이터(isrc)를 출력해봤을 때, 저장된 데이터의 순서는 항상 일정하게 불러와지고 있었다.
즉, 원인은 isrc값을 통해 MusicKit의 음악 데이터를 불러오는 곳에 있었다.
getMusic(with:)
메서드 내부를 보면 파라미터로 전달받은 isrcs
배열의 각 원소에 대해 음악 데이터를 비동기적으로 요청하게 된다.
TaskGroup
을 활용해 비동기 작업들을 그룹화하고 있다.로딩이 완료된 음악 데이터는 기존 순서와 상관 없이 비동기적으로 musics
배열에 추가되는데,
⇒ 이 방식에서는 최종 데이터의 순서가 보장되지 않는다.
⇒ 그렇기 때문에 플레이리스트 화면을 들어올 때마다 순서가 달라지는 문제가 발생하고 있던 것이다. (+캐싱을 하지 않아서 그런 것도 있을 것이다.)
func getMusic(with isrcs: [String]) async -> [MolioMusic] {
return await withTaskGroup(of: MolioMusic?.self) { group in
var musics: [MolioMusic] = []
for isrc in isrcs {
group.addTask {
return await getMusic(with: isrc)
}
}
**/*
로딩이 완료된 음악 데이터는 비동기적으로 musics 배열에 추가되기 때문에
순서가 보장되지 않는다.
*/
for await music in group {
if let music {
musics.append(music)
}
}**
return musics
}
}