Skip to content

Commit dcd20d6

Browse files
authored
Merge pull request #23 from ServerDriven/develop
Screen and Image File Store and Provider
2 parents 666c158 + f7f1228 commit dcd20d6

File tree

7 files changed

+33
-27
lines changed

7 files changed

+33
-27
lines changed

Package.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ let package = Package(
1818
// Dependencies declare other packages that this package depends on.
1919
// .package(url: /* package url */, from: "1.0.0"),
2020
.package(name: "ScreenData", url: "https://github.com/ServerDriven/ScreenData-swift", from: "0.4.1"),
21-
.package(name: "ScreenDataNavigation", url: "https://github.com/ServerDriven/ScreenDataNavigation-swift", from: "0.5.0"),
21+
.package(name: "ScreenDataNavigation", url: "https://github.com/ServerDriven/ScreenDataNavigation-swift", from: "1.0.0"),
2222
.package(url: "https://github.com/0xLeif/Chronicle", from: "0.2.3")
2323
],
2424
targets: [

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,9 +121,9 @@ Before showing a `SDScreen` you can override the ScreenDataUI default values. Yo
121121
SDScreenProvider.default = ScreenProvider()
122122

123123
// MARK: SDScreenStore default
124-
// UserDefaultScreenStorer is from ScreenDataNavigation
124+
// FileScreenStore is from ScreenDataNavigation
125125

126-
SDScreenStore.default = UserDefaultScreenStorer(baseKey: "example")
126+
SDScreenStore.default = FileScreenStore(baseKey: "example")
127127

128128
// MARK: SDCustomViews
129129
// Views that conform to SDCustomizedView

Sources/ScreenDataUI/Helpers/SDImage/SDImageProviding.swift

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public struct SDImageURLProvider: SDImageProviding {
2929
}
3030

3131
guard let data = data else {
32-
log(level: .error("Could not load Image for URL (\(url)). Response: \(String(describing: response)).", nil))
32+
log(level: .error("(SDImageURLProvider) Could not load Image for URL (\(url)). Response: \(String(describing: response)).", nil))
3333
promise(.success(nil))
3434
return
3535
}
@@ -42,17 +42,19 @@ public struct SDImageURLProvider: SDImageProviding {
4242
}
4343
}
4444

45-
public struct SDImageUserDefaultsProvider: SDImageProviding {
45+
public struct SDImageFileProvider: SDImageProviding {
4646
public init() { }
4747

4848
public func image(forURL url: URL) -> AnyPublisher<UIImage?, Error> {
4949
Future { promise in
50-
let imageData: Data? = UserDefaults.standard.data(
51-
forKey: url.absoluteString
52-
)
50+
let key = url.absoluteString.replacingOccurrences(of: "/", with: "-")
51+
let path = FileManager.default.urls(
52+
for: .documentDirectory,
53+
in: .userDomainMask
54+
)[0].appendingPathComponent(key)
5355

54-
guard let data = imageData else {
55-
log(level: .error("Could not load Image for URL (\(url)).", nil))
56+
guard let data = try? Data(contentsOf: path) else {
57+
log(level: .error("(SDImageFileProvider) Could not load Image from path (\(path.absoluteString)).", nil))
5658
promise(.success(nil))
5759
return
5860
}
@@ -63,11 +65,11 @@ public struct SDImageUserDefaultsProvider: SDImageProviding {
6365
}
6466
}
6567

66-
public struct SDImageURLUserDefaultsProvider: SDImageProviding {
68+
public struct SDImageURLFileProvider: SDImageProviding {
6769
public init() { }
6870

6971
public func image(forURL url: URL) -> AnyPublisher<UIImage?, Error> {
70-
SDImageUserDefaultsProvider()
72+
SDImageFileProvider()
7173
.image(forURL: url)
7274
.flatMap { image -> AnyPublisher<UIImage?, Error> in
7375
guard let image = image else {

Sources/ScreenDataUI/Helpers/SDImage/SDImageStoring.swift

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,21 @@ public protocol SDImageStoring {
1313
func store(image: UIImage?, forURL url: URL) -> AnyPublisher<Void, Error>
1414
}
1515

16-
public struct SDImageUserDefaultsStorer: SDImageStoring {
16+
public struct SDImageFileStore: SDImageStoring {
1717
public init() { }
1818

1919
public func store(image: UIImage?, forURL url: URL) -> AnyPublisher<Void, Error> {
2020
Future { promise in
21+
let key = url.absoluteString.replacingOccurrences(of: "/", with: "-")
22+
let path = FileManager.default.urls(
23+
for: .documentDirectory,
24+
in: .userDomainMask
25+
)[0].appendingPathComponent(key)
26+
2127
if let imageData = image?.pngData() {
22-
UserDefaults.standard.set(imageData, forKey: url.absoluteString)
23-
} else {
24-
UserDefaults.standard.set(nil, forKey: url.absoluteString)
28+
try? imageData.write(to: path)
2529
}
30+
2631
promise(.success(()))
2732
}
2833
.eraseToAnyPublisher()

Sources/ScreenDataUI/Navigation/SDScreenProvider.swift

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,9 @@ public struct SDScreenProvider: ScreenProviding {
1717

1818
public func screen(forID id: String) -> AnyPublisher<SomeScreen, Error> {
1919
guard let provider = SDScreenProvider.default else {
20-
return ScreenDataNavigation.MockScreenProvider(
21-
mockScreen: SomeScreen(
22-
title: "Mock Screen",
23-
backgroundColor: SomeColor(red: 1, green: 1, blue: 1),
24-
someView: SomeText(title: "Set SDScreenProvider.default").someView
25-
)
26-
)
27-
.screen(forID: id)
28-
.eraseToAnyPublisher()
20+
return FileScreenProvider(baseKey: "SDScreenStore")
21+
.screen(forID: id)
22+
.eraseToAnyPublisher()
2923
}
3024

3125
return provider.screen(forID: id)

Sources/ScreenDataUI/Navigation/SDScreenStore.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public struct SDScreenStore: ScreenStoring {
1919
public func store(screens: [SomeScreen]) -> AnyPublisher<Void, Error> {
2020
guard let store = SDScreenStore.default else {
2121
log(level: .info("Saving SomeScreens: \(screens.map(\.id))"))
22-
return ScreenDataNavigation.UserDefaultScreenStorer(baseKey: "SDScreenStore")
22+
return FileScreenStore(baseKey: "SDScreenStore")
2323
.store(screens: screens)
2424
}
2525

Sources/ScreenDataUI/Views/SDScreen.swift

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,12 @@ public struct SDScreen: View, Equatable {
2525
}
2626
.eraseToAnyPublisher()
2727
.sink(
28-
receiveCompletion: { _ in sema.signal() },
28+
receiveCompletion: { completion in
29+
if case let .failure(error) = completion {
30+
log(level: .error("SDScreen.init -> SDScreenStore.store", error))
31+
}
32+
sema.signal()
33+
},
2934
receiveValue: { _ in }
3035
)
3136

0 commit comments

Comments
 (0)