Какие изменения кода (код прикреплен) необходимы для обеспечения динамического поведения переменной @FetchRequest данных ядра? - PullRequest
0 голосов
/ 28 октября 2019

Как мой код должен быть изменен, чтобы в случае исключения на уровне базовых данных при добавлении нового элемента, что SwiftUI НЕ продолжал показывать новый элемент?

Справочная информация: Когда я запускаю приведенный ниже код, я получаю исключение при добавлении нового элемента, выполняющего "context.save ()", ОДНАКО, хотя запрос нового элемента действительно не выполнен (не сохранен в Core Data)пользовательский интерфейс показывает новый элемент. Как будто переменная «списки» в строке @FetchRequest не ведет себя динамически.

Вопрос - Как исправить код, чтобы приложение работало правильно?

Код:

import SwiftUI

struct ContentView: View {
    @Environment(\.managedObjectContext) var context
    @FetchRequest(fetchRequest: List.allListFetchRequest()) var lists: FetchedResults<List>

    private func addListItem() {
        let newList = List(context: context)
        newList.id = 1
        newList.title = "Testing 123"
        do {
            try context.save()
        } catch let e as NSError {
            print("Could not save new List. \(e.debugDescription)")
            return
        }

    }

    var body: some View {
        NavigationView {
            VStack {
                ForEach(lists) { list in
                    Text("List = \(list.title)")
                }
            }
            .navigationBarTitle( Text("My Todo Lists") )
            .navigationBarItems(
                trailing: Button(action: {self.addListItem()} ) {
                    Image(systemName: "plus.square")
                }
            )
        }
    }
}

Пример вывода:

Could not save new List. Error Domain=NSCocoaErrorDomain Code=133021 "(null)" UserInfo={NSExceptionOmitCallstacks=true, conflictList=(
    "NSConstraintConflict (0x600001fcccc0) for constraint (\n    id\n): database: (null), conflictedObjects: (\n    \"0x600000a7e360 <x-coredata:///List/t2F01130C-0D2A-4E88-A77D-A7BA0E921C213>\",\n    \"0xfb1bb528bb57810c <x-coredata://41B391F1-A95C-4971-9584-A2D3DFFF5380/List/p3>\"\n)"
)}

1 Ответ

0 голосов
/ 01 ноября 2019

Джим Дави дал мне путь вперед с этим предложением:

private func addListItem() {  
    context.performBlock { context in  
        let newList = List(context: context)  
        newList.id = 1  
        newList.title = "Testing 123"  
        do {  
            try context.save()  
        }  
        catch {  
            print("Failed to save new item. Error = \(error)")  
            context.delete(newList)  
            // don't need to save here, because we're in `performBlock` and have reverted the only unsaved change.  
        }  
    }  
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...