Added "Store"-Button in Content View, which stores sample Data as a JSON-File with the required structure

This commit is contained in:
severin.memmishofer 2023-07-10 11:48:07 +02:00
parent a8ca380c29
commit 827052f531
3 changed files with 33 additions and 10 deletions

View File

@ -10,6 +10,7 @@ import CoreBluetooth
struct ContentView: View {
@ObservedObject private var bluetoothViewModel = BluetoothViewModel()
@StateObject private var store = FeedStore(feed: Feed.sampleFeed)
var body: some View {
VStack {
@ -17,6 +18,16 @@ struct ContentView: View {
.imageScale(.large)
.foregroundColor(.accentColor)
Text("Hello, world!")
Spacer()
Button("Save Feed") {
Task {
do {
try await store.save(feed: Feed.sampleFeed)
} catch {
fatalError(error.localizedDescription)
}
}
}
}
.padding()
NavigationView {

View File

@ -9,8 +9,14 @@ import Foundation
struct Feed: Codable {
let feedID: String
let feed: [LogEntry]
init(feedID: String = "", feed: [LogEntry] = []) {
self.feedID = feedID
self.feed = feed
}
}
extension Feed {
@ -22,4 +28,6 @@ extension Feed {
LogEntry(feedid: "BOB", sequenceNumber: 3, body: Body(tag: "txt", value: "Welcome Alice"))
]
static let sampleFeed: Feed = Feed(feedID: "BOB", feed: sampleData)
}

View File

@ -10,33 +10,37 @@ import SwiftUI
@MainActor
class FeedStore: ObservableObject {
@Published var feed: [LogEntry] = []
@Published var feed: Feed
private static func fileURL() throws -> URL {
init(feed: Feed) {
self.feed = feed
}
private func fileURL() throws -> URL {
try FileManager.default.url(for: .documentDirectory,
in: .userDomainMask,
appropriateFor: nil,
create: false)
.appendingPathComponent("feed.data")
.appendingPathComponent("\(feed.feedID).json")
}
func load() async throws {
let task = Task<[LogEntry], Error> {
let fileURL = try Self.fileURL()
let task = Task<Feed, Error> {
let fileURL = try self.fileURL()
guard let data = try? Data(contentsOf: fileURL) else {
return []
return Feed()
}
let logEntries = try JSONDecoder().decode([LogEntry].self, from: data)
return logEntries
let feed = try JSONDecoder().decode(Feed.self, from: data)
return feed
}
let feed = try await task.value
self.feed = feed
}
func save(feed: [LogEntry]) async throws {
func save(feed: Feed) async throws {
let task = Task {
let data = try JSONEncoder().encode(feed)
let outfile = try Self.fileURL()
let outfile = try self.fileURL()
try data.write(to: outfile)
}
_ = try await task.value