Как встроить контейнер модели SwiftData в пользовательский тип документа пакета файлов

Я провел много исследований по этому поводу, но не смог найти действенного решения этой проблемы. Мои знания и опыт работы с Swift и SwiftUI/SwiftData/AppKit/UIKit ограничены, поэтому я, вероятно, не правильно вижу проблему, чтобы найти решение.

Фон:

Я пытаюсь создать универсальное приложение для macOS/iOS, которое организует медиафайлы (изображения/видео/pdf); думайте о его функциональности как о приложении Apple Photos. Итак, для моего типа документа приложения у меня будет собственный пакет файлов, а в папке пакета будут файл-контейнер модели SwiftData и папки для хранения пользовательских медиафайлов.

Принятые подходы:

  1. DocumentGroup с моделью SwiftData, затем записывайте непосредственно в пакет файлов.

В сцене моего приложения я создаю документ, используя DocumentGroup(editing: .customDocument,migrationPlan: CustomMigrationPlan.self). Это создаст документ с контейнером модели с моей моделью SwiftData. И когда мне нужно добавить медиафайлы в документ, я получаю URL-адрес документа, а затем использую FileManager, чтобы записать файл в нужную папку в документе. В результате медиафайл сохраняется в пакете файлов, но затем контейнер SwiftData повреждается (все данные модели сбрасываются до пустых).

Сейчас я пытаюсь:

  1. DocumentGroup с пользовательским пакетом файлов, затем попробуйте внедрить контейнер SwiftData.

В моем нынешнем подходе я бы создал документ, используя DocumentGroup(newDocument: CustomFileDocument()). У меня есть собственные FileDocument и FileWrapper. Но проблема в том, что я не знаю, как встроить контейнер SwiftData в свой FileDocument. Можно ли создать контейнер модели SwiftData при инициализации моего FilerWrapper? Я не могу понять, как это сделать.

Может ли кто-нибудь посоветовать, как мне это сделать? Или, может быть, я неправильно смотрю на эту проблему? Нужно ли мне использовать AppKit/UIKit с Core Data, поскольку в настоящее время это невозможно с помощью SwiftUI/SwiftData?

Большое спасибо за чтение, и любой вклад очень ценится.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
102
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Для этого вы можете использовать ModelDocument . И есть пример Создание приложения на основе документов с использованием SwiftData и видео Создание приложения с помощью SwiftData (WWDC 2023).

например

 @main
 struct Todo: App {
     var body: some Scene {
         DocumentGroup(editing: TodoItem.self, contentType: .todoItem) {
             ContentView()
         }
     }
 }


 struct ContentView: View {
     @Query var items: [TodoItem]


         var body: some View {
             List {
                 ForEach(items) { item in
                     @Bindable var item = item
                     Toggle(item.text, isOn: $item.isDone)
                 }
              }
         }
 }


 @Model
 final class TodoItem {
     var created: Date
     var text: String
     var isDone = false
 }


 extension UTType {
     static var todoItem = UTType(exportedAs: "com.myApp.todoItem")
 }

Откуда: https://developer.apple.com/documentation/swiftui/documentgroup/init(editing:contenttype:editor:preparedocument:)-9ents

Проблема, с которой вы, вероятно, столкнетесь, заключается в том, что пользовательский интерфейс документа предназначен для открытия разных файлов, а не всегда одного и того же файла библиотеки. Вам также, вероятно, следует проверить, что Swift Data не сломается, если файл будет перемещен, пока он открыт.

Большое спасибо. Используя инициализатор сцены DocumentGroup(редактирование: Card.self, contentType: <#UTType#>) вместо DocumentGroup(редактирование: <#UTType#>,migrationPlan: <#SchemaMigrationPlan#>), я смог записать в файл документа. Вы мне очень помогли. Спасибо.

Cakelly 27.06.2024 02:29

Отлично, на случай, если это поможет, я добавил только что найденный образец побольше.

malhal 27.06.2024 08:36

Другие вопросы по теме