SwiftUI에서 ForEach를 사용할때가 많은데 ForEach에서 Looping되는 객체의 값이 변하는데도 내부의 View를 봤을때 업데이트가 안되는 경우가 있다. 내가 사용하는 방식이 완전 맞는건 아니지만 두가지 방법으로 View를 업데이트 시켜보겠다.
EX)
// Model
struct Schedule {
var work : [String]
}
// ForEach에 사용될 array
@Published var schedules : [Schedule] = ["A", "B", "C", "D"]
// in View
VStack {
ForEach(self.schedules, id: \.id) { schedule in
Text(schedule)
}
}
// schedules의 item에 값을 변경하면
schedules[0] = "a"
// View에서는 "a"가 아니라 "A"가 그대로 나온다.
SwiftUI는 View를 그리는데에 자원을 최소한으로 사용하려는 경향이 있다. 그래서 위와 같이 item의 id는 변화가 없는 경우나 item 수에 변화가 없는 경우와 같은 자원으로 처리하기 때문에 업데이트가 없다. 이런 경우 강제로 업데이트가 가능하도록 해줘야한다.
let copiedSchedules = schedules // schedules 객체를 복사
schedules.removeAll() // schedules의 item들을 다 지운다.
schedules = copiedSchedules // 복사본을 schedules에 넣어준다.
schedules.append("E") // append이기 때문에 array의 마지막 부분에 새로운 item이 추가된다.
schedules.removeLast() // schedules의 마지막 item("E")을 지운다.
API Call의 response로 업데이트 된 데이터가 들어올 경우 기존의 View를 업데이트 해줘야할 수도 있고 Navigation으로 왔다갔다할때도 사용해야할 수도 있다. 위와 같은 방법으로 해결 가능하다. 더 정규화된 방법을 찾아봐야할거같다.