Как создать в памяти ModelContainer для SwiftData?IOS

Программируем под IOS
Ответить
Anonymous
 Как создать в памяти ModelContainer для SwiftData?

Сообщение Anonymous »

Справочная информация
Я пытался изучить SwiftData с синхронизацией iCloud и хочу создать хранилище данных в памяти, чтобы можно было тестировать концепции с помощью фиктивных данных, которые добавляются при загрузке и никогда не сохраняются. .
Таким образом, я могу поиграть с данными, закрыть приложение и перезагрузить его, чтобы вернуться к началу. Если я хочу затем поиграть с существующими данными, я могу снять флажок «Только память» и использовать синхронизированные данные iCloud.
Причина вопроса
Проблема заключается в том, что он, похоже, игнорирует isStoredInMemoryOnly при создании SwiftData ModelConfiguration и сохраняет и загружает из источника iCloud, а не из источника в памяти.
Хотя я знаю, что могу быстро создать кнопку «удалить и сбросить все». Теперь я хочу знать, что я делаю неправильно, поскольку я также использую этот же флаг для предварительного просмотра, поэтому не хочу, чтобы возникали другие проблемы из-за тестирования в предварительных просмотрах, сохраняемых в моих данных хранилище.
Предположения
Я не читал ни в одном источнике Apple, что параметр isStoredInMemoryOnly делает то, что говорит, и не позволяет ModelContainer сохранять данные в iCloud. Я не нашел официального описания этого параметра, но думаю, что название понятно.
Дополнительная информация и воссоздание
Мой первый тест (используя приведенный ниже код) работало нормально, так как каждый раз, когда я закрывал приложение, оно теряло данные, но затем я загружал приложение в другой симулятор и обнаруживал, что оно сохраняет данные в iCloud, поскольку перезагрузка приложения не работала очистил данные и не удалял и не переустанавливал приложение, поскольку оно просто извлекло ранее сохраненные данные из iCloud...
Я пробовал это на физическом iPhone, а также удалял приложение со всех симуляторов и физических устройств, удаление данных iCloud для этой учетной записи, а также сброс приложения из консоли CloudKit, и теперь все тесты заставляют его хранить все данные в iCloud, и я даже не могу воспроизвести первоначальный успех.
Вот пример кода (по сути, код синхронизации Apple iCloud по умолчанию, но для параметра isStoredInMemoryOnly установлено значение true.
Вопросы

[*]Я думаю, первое, что нужно спросить, это может ли кто-нибудь подтвердить (через документы Apple), что параметр isStoredInMemoryOnly при создании новая ModelConfiguration (показанная в строке 20 ниже) на самом деле предназначена для предотвращения ее сохранения в контейнере CloudKit, или если это просто плохое имя, и все, кто так говорит, так и предполагали.

Если это так, значит, что-то не так с моим примером кода или это просто (известная?) ошибка.

< /ol>
Пример кода
Ниже приведен краткий пример. Чтобы использовать его, вам понадобится пустой контейнер iCloud, подключенный к выбранной службе CloudKit.
import SwiftUI
import SwiftData
import Foundation

@Model
final class Item {
var timestamp: Date?

init(timestamp: Date) {
self.timestamp = timestamp
}
}

@main
struct CloudKitTest_TempApp: App {
var sharedModelContainer: ModelContainer = {
let schema = Schema([
Item.self,
])
let modelConfiguration = ModelConfiguration(schema: schema, isStoredInMemoryOnly: true)

do {
return try ModelContainer(for: schema, configurations: [modelConfiguration])
} catch {
fatalError("Could not create ModelContainer: \(error)")
}
}()

var body: some Scene {
WindowGroup {
ContentView()
}
.modelContainer(sharedModelContainer)
}
}

struct ContentView: View {
@Environment(\.modelContext) private var modelContext
@Query private var items: [Item]

var body: some View {
NavigationSplitView {
List {
ForEach(items) { item in
if (item.timestamp != nil) {
NavigationLink {
Text("Item at \(item.timestamp!, format: Date.FormatStyle(date: .numeric, time: .standard))")
} label: {
Text(item.timestamp!, format: Date.FormatStyle(date: .numeric, time: .standard))
}
}
}
.onDelete(perform: deleteItems)
}
.toolbar {
ToolbarItem(placement: .navigationBarTrailing) {
EditButton()
}
ToolbarItem {
Button(action: addItem) {
Label("Add Item", systemImage: "plus")
}
}
}
} detail: {
Text("Select an item")
}
}

private func addItem() {
withAnimation {
let newItem = Item(timestamp: Date())
modelContext.insert(newItem)
}
}

private func deleteItems(offsets: IndexSet) {
withAnimation {
for index in offsets {
modelContext.delete(items[index])
}
}
}
}


Подробнее здесь: https://stackoverflow.com/questions/777 ... -swiftdata
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»