Создание нового NSManagedObject в качестве привязки для вновь представленного представления создает бесконечное l oop NSManagedObjects. - PullRequest
1 голос
/ 07 мая 2020

Я пытаюсь настроить модальное представление в SwiftUI, которое можно использовать как для создания новых объектов (в данном контексте назначений), так и для редактирования существующих. Чтобы отредактировать назначение, я просто передаю это назначение представлению как наблюдаемый объект. Я подумал, что было бы просто использовать это представление для создания новых назначений, создавая новое назначение в контексте, пока я вызываю представление, например:

AssignmentEditorView(assignment: Assignment(context: self.context))

The просмотр загружается просто отлично, но очень медленный и медленный. Он бесконечно создавал новые объекты присваивания в контексте, пока я не закрыл модальное представление. Кто-нибудь знает, почему это происходит и как я могу это исправить?

Я хочу, чтобы представление создавало новое назначение в том виде, в каком оно появляется, и чтобы это новое назначение действовало как свойство @ObservedObject var assignment: Assignment представления.

Изменить: вот код в контексте. Лист отображается поверх основного представления, когда пользователь нажимает кнопку «добавить».

Button(action: {
    self.newAssignmentViewIsPresented = true
}) {
    Image(systemName: "plus")
         .font(.title)
}
    .sheet(isPresented: $newAssignmentViewIsPresented) {
        AssignmentEditorView(assignment: Assignment(context: self.context))
        .environment(\.managedObjectContext, self.context)
    })

1 Ответ

0 голосов
/ 07 мая 2020

Я предполагаю, что эта строка

AssignmentEditorView(assignment: Assignment(context: self.context))

является представлением в определении body var. Конструкции представлений не должны иметь побочных эффектов, потому что их можно назвать множеством. Вы не должны вставлять запись в базу данных каждый раз, когда вызывается body.

Не уверен, что предложить, но, например:

 AssignmentEditorView(assignmentCreator: { Assignment(context: self.context) })

Позволит вам построить представление без побочный эффект. Затем вы можете вызвать закрытие в представлении редактора, когда вам понадобится назначение.

...