삽질 이야기

[SwiftUI] List의 ForEach에서 FetchedResult 데이터 삭제 시 딜레이 현상

_히처리_ 2023. 9. 15. 14:45

List에서 행의 인덱스가 필요해서 다음과 같이 코드를 작성했다.

struct PrayersView: View {
    ...
    
    @FetchRequest(
        sortDescriptors: [NSSortDescriptor(keyPath: \Prayer.name, ascending: true)],
        animation: .default)
    private var items: FetchedResults<Prayer>
    
    var body: some View {
        List {
            ForEach(items.indices, id: \.self) { index in
                NavigationLink(destination: {
                    PrayerDetailView(items: items, startIndex: index)
                }, label: {
                    Text(items[index].getName())
                        .padding(.vertical)
                })

 

코드만으로는 딜레이가 발생하는 원인을 알 수 없어서 코드를 하나씩 변경해가면서 확인했다.

원인은 ForEach에서 id를 사용해서 발생하는 문제였다.

 

그래서 인덱스를 구하는 메서드를 만들어서 아래와 같이 코드를 수정하니 잘 작동했다.

    var body: some View {
        List {
            ForEach(items) { item in
                NavigationLink(destination: {
                    PrayerDetailView(items: items, startIndex: getIndex(prayer: item))
                }, label: {
                    Text(item.getName())
                        .padding(.vertical)
                })