Приложение SwiftUI (iOS 14) испытывает конфликт с NSMergeConflict

#core-data #swiftui

Вопрос:

Хотя в StackOverflow есть несколько вопросов о конфликте слияний, кажется, что все они относятся к более чем 4-летней давности, и с помощью кода/идей я не смог интегрироваться в новое базовое приложение SwiftUI с помощью CloudKit. Это происходит не каждый раз, но, вероятно, 1 из 3 записей спасает меня от фатальной ошибки:

 NSManagedObjectContext Extension.swift-16: Unresolved error Error Domain=NSCocoaErrorDomain Code=133020 "Could not merge changes." UserInfo={conflictList=(
    "NSMergeConflict (0x28359e700) for NSManagedObject (0x280ca2f30) with objectID '0x8e8643f3d377df5d <x-coredata://F0AEE26E-FCF0-464B-A886-6A781D2D28D9/Journal/p5>' with oldVersion = 2 and newVersion = 4 and old object snapshot = {n    dateCreated = "2021-07-27 00:29:32  0000";n    id = "4258E1DA-9EE3-487B-87F4-41023D4857E8";n    name = "Test Journal";n} and new cached row = {n    dateCreated = "2021-07-27 00:29:32  0000";n    id = "4258E1DA-9EE3-487B-87F4-41023D4857E8";n    name = "Test Journal";n}"
), NSExceptionOmitCallstacks=true}, ["NSExceptionOmitCallstacks": 1, "conflictList": 
 

Мой файл Persistence.swift является запасным.

Представление содержимого:

 struct ContentView: View {
@Environment(.managedObjectContext) private var viewContext
@FetchRequest(fetchRequest: Journal.allRecordsByNameFetchRequest)
private var journals: FetchedResults<Journal>
@State var showEditJournalSheetView = false
    
    var body: some View {
        NavigationView {
            ZStack(alignment: .bottomTrailing) {
                List {
                    ForEach(journals, id: .id) { journal in
                        NavigationLink(destination: makeJournalDetailView(from: journal)) {
                            makeJournalRow(from: journal)
                        }
                    }
                }
            }
            .sheet(isPresented: $showEditJournalSheetView) {
                EditJournalView(journal: nil, showEditJournalSheetView: $showEditJournalSheetView)
                    .environment(.managedObjectContext, viewContext)
            }
 

EditJournalView:

 struct EditJournalView: View {
    @Environment(.managedObjectContext) private var viewContext
    let journal: Journal?

.......

.toolbar {
                ToolbarItem(placement: .primaryAction) {
                    Button("Save") {
                        if isFormValid() {
                            showFormErrorMessage = false
                            if journal != nil {
                                saveJournalChanges() //TODO: Maybe add closure so doesn't close out too early
                            } else {
                                createNewJournal()
                            }
                            self.showEditJournalSheetView = false
                        } else {
                            showFormErrorMessage = true
                        }
                    }
                }


.......

private func createNewJournal() {
        Journal.create(name: name, context: viewContext)
    }

 

И, наконец,,

Журнал Расширение.swift

 extension Journal {
    static func create(name: String?, context: NSManagedObjectContext) {
        let newJournal = Journal(context: context)
        newJournal.id = UUID()
        newJournal.name = name?.isEmpty == false ? name : "Untitled"
        newJournal.dateCreated = Date()

        context.saveContext()
    }
 

Любая помощь будет очень признательна!

Комментарии:

1. Эта ошибка не имеет никакого отношения к SwiftUI. Очевидно, что это ошибка CoreData, которую мы не можем вам помочь решить, потому что вы практически не предоставили код, непосредственно связанный с CoreData. Я предлагаю вам ознакомиться с документацией CoreData и убедиться, что вы правильно настроили CoreData, проверьте политики слияния, возможно, раздел, в котором говорится о синхронизации с CloudKit.

2. Привет, проблема связана с CoreData, но я использую совершенно новый многоплатформенный проект в Xcode 12.5.1 с проверками «Использовать основные данные» и «Хост в CloudKit», поэтому все, что я не показывал,-это все акции Apple. Я показал уникальные части, которые я добавил, но, опять же, мне кажется, это довольно прямолинейно, но не работает?? Вот почему я вызываю SwiftUI, так как это совсем другая настройка CoreData (по умолчанию от Apple), чем я видел при использовании CoreData в Swift4 в старых проектах. Это заставило меня не знать, как перевести «исправления» из Интернета в этот проект.