Added "Store"-Button in Content View, which stores sample Data as a JSON-File with the required structure
This commit is contained in:
parent
a8ca380c29
commit
827052f531
@ -10,6 +10,7 @@ import CoreBluetooth
|
|||||||
|
|
||||||
struct ContentView: View {
|
struct ContentView: View {
|
||||||
@ObservedObject private var bluetoothViewModel = BluetoothViewModel()
|
@ObservedObject private var bluetoothViewModel = BluetoothViewModel()
|
||||||
|
@StateObject private var store = FeedStore(feed: Feed.sampleFeed)
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
VStack {
|
VStack {
|
||||||
@ -17,6 +18,16 @@ struct ContentView: View {
|
|||||||
.imageScale(.large)
|
.imageScale(.large)
|
||||||
.foregroundColor(.accentColor)
|
.foregroundColor(.accentColor)
|
||||||
Text("Hello, world!")
|
Text("Hello, world!")
|
||||||
|
Spacer()
|
||||||
|
Button("Save Feed") {
|
||||||
|
Task {
|
||||||
|
do {
|
||||||
|
try await store.save(feed: Feed.sampleFeed)
|
||||||
|
} catch {
|
||||||
|
fatalError(error.localizedDescription)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
.padding()
|
.padding()
|
||||||
NavigationView {
|
NavigationView {
|
||||||
|
|||||||
@ -9,8 +9,14 @@ import Foundation
|
|||||||
|
|
||||||
struct Feed: Codable {
|
struct Feed: Codable {
|
||||||
|
|
||||||
|
let feedID: String
|
||||||
let feed: [LogEntry]
|
let feed: [LogEntry]
|
||||||
|
|
||||||
|
init(feedID: String = "", feed: [LogEntry] = []) {
|
||||||
|
self.feedID = feedID
|
||||||
|
self.feed = feed
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
extension Feed {
|
extension Feed {
|
||||||
@ -22,4 +28,6 @@ extension Feed {
|
|||||||
LogEntry(feedid: "BOB", sequenceNumber: 3, body: Body(tag: "txt", value: "Welcome Alice"))
|
LogEntry(feedid: "BOB", sequenceNumber: 3, body: Body(tag: "txt", value: "Welcome Alice"))
|
||||||
]
|
]
|
||||||
|
|
||||||
|
static let sampleFeed: Feed = Feed(feedID: "BOB", feed: sampleData)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -10,33 +10,37 @@ import SwiftUI
|
|||||||
@MainActor
|
@MainActor
|
||||||
class FeedStore: ObservableObject {
|
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,
|
try FileManager.default.url(for: .documentDirectory,
|
||||||
in: .userDomainMask,
|
in: .userDomainMask,
|
||||||
appropriateFor: nil,
|
appropriateFor: nil,
|
||||||
create: false)
|
create: false)
|
||||||
.appendingPathComponent("feed.data")
|
.appendingPathComponent("\(feed.feedID).json")
|
||||||
}
|
}
|
||||||
|
|
||||||
func load() async throws {
|
func load() async throws {
|
||||||
let task = Task<[LogEntry], Error> {
|
let task = Task<Feed, Error> {
|
||||||
let fileURL = try Self.fileURL()
|
let fileURL = try self.fileURL()
|
||||||
guard let data = try? Data(contentsOf: fileURL) else {
|
guard let data = try? Data(contentsOf: fileURL) else {
|
||||||
return []
|
return Feed()
|
||||||
}
|
}
|
||||||
let logEntries = try JSONDecoder().decode([LogEntry].self, from: data)
|
let feed = try JSONDecoder().decode(Feed.self, from: data)
|
||||||
return logEntries
|
return feed
|
||||||
}
|
}
|
||||||
let feed = try await task.value
|
let feed = try await task.value
|
||||||
self.feed = feed
|
self.feed = feed
|
||||||
}
|
}
|
||||||
|
|
||||||
func save(feed: [LogEntry]) async throws {
|
func save(feed: Feed) async throws {
|
||||||
let task = Task {
|
let task = Task {
|
||||||
let data = try JSONEncoder().encode(feed)
|
let data = try JSONEncoder().encode(feed)
|
||||||
let outfile = try Self.fileURL()
|
let outfile = try self.fileURL()
|
||||||
try data.write(to: outfile)
|
try data.write(to: outfile)
|
||||||
}
|
}
|
||||||
_ = try await task.value
|
_ = try await task.value
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user