#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 в старых проектах. Это заставило меня не знать, как перевести «исправления» из Интернета в этот проект.