Aqui está um exemplo:
struct DemoApp: View {
@State var viewModel = DemoAppViewModel()
var body: some View {
VStack {
DemoMonthView(date: viewModel.monthDate)
DemoDayView(date: viewModel.dayDate) // FIRST
.onTapGesture {
viewModel.dayDate = viewModel.dayDate.addingTimeInterval(86000)
}
DemoDayView(date: viewModel.monthDate) // SECOND
.onTapGesture {
viewModel.monthDate = viewModel.monthDate.addingTimeInterval(1400000)
}
}
}
}
@Observable
class DemoAppViewModel {
var dayDate: Date = Date()
var monthDate: Date = Date()
}
struct DemoMonthView: View {
var date: Date
@FetchRequest private var days: FetchedResults<Day> //you need to replace Day here with any Entity that will allow to reproduce the issue
init(date: Date) {
self.date = date
_days = FetchRequest(
sortDescriptors: [SortDescriptor(\.date, order: .reverse)],
predicate: NSPredicate(value: true)
)
print("DemoMonthView init is called") //should be called, but without body redraws
// heavy calculations for given month
}
var body: some View {
if #available(iOS 17.1, *) {
print("DemoMonthView body is called") //should not be called❓
}
return VStack {
Text(date.formatted(date: .long, time: .omitted)).font(.title.bold())
}
}
}
struct DemoDayView: View {
var date: Date
var body: some View {
Text(date.formatted(date: .long, time: .omitted))
}
}
#Preview {
DemoApp()
}
Simplificando, quando você toca FIRST
no botão, ele não deveria redesenhar a DemoMonthView, mas redesenha. Por quê? Eu realmente preciso evitar isso tocando FIRST
no botão toda vez. SECOND
O botão redesenha DemoMonthView
a visualização corretamente, pelo que entendi. Mas por que o PRIMEIRO?
Quando comento days
e _days
associo no init, então está tudo bem, ele NÃO redesenha...
Mas essa situação é apenas uma versão resumida do meu aplicativo real, mais complexo. Há uma fetchRequest com cálculos complexos que não deveria ser chamada com tanta frequência, como tocar no botão, como aqui no exemplo, quando tocar nesse botão não altera nada relacionado à DemoMonthView.
Se o motivo for a falta de conhecimento, o que devo saber para evitar isso?
Por que isso importa aqui? Porque preciso atualizar isso DemoMonthView
SOMENTE quando monthDate
houver alterações, não sempre que houver dayDate
alterações.