From 5e536556da07167e4fa9adc0c93ea27ccd14640e Mon Sep 17 00:00:00 2001 From: John Estropia Date: Wed, 19 Aug 2020 11:01:12 +0900 Subject: [PATCH] fix for SR-13069 --- .../Modern.PokedexDemo.MainView.swift | 47 ++++++++++++------- .../Modern.PokedexDemo.Service.swift | 24 ++++++---- Sources/Field.Coded.swift | 20 ++++---- Sources/Field.Stored.swift | 4 +- 4 files changed, 59 insertions(+), 36 deletions(-) diff --git a/Demo/Sources/Demos/Modern/PokedexDemo/Modern.PokedexDemo.MainView.swift b/Demo/Sources/Demos/Modern/PokedexDemo/Modern.PokedexDemo.MainView.swift index 1d8a2cf..cdf100b 100644 --- a/Demo/Sources/Demos/Modern/PokedexDemo/Modern.PokedexDemo.MainView.swift +++ b/Demo/Sources/Demos/Modern/PokedexDemo/Modern.PokedexDemo.MainView.swift @@ -32,31 +32,46 @@ extension Modern.PokedexDemo { // MARK: View var body: some View { - ScrollView { - ForEach(self.pokedexEntries.snapshot, id: \.self) { pokedexEntry in - LazyView { - Text(pokedexEntry.snapshot?.$name ?? "") + ZStack { + ScrollView { + ForEach(self.pokedexEntries.snapshot.prefix(self.visibleItems), id: \.self) { pokedexEntry in + LazyView { + Text(pokedexEntry.snapshot?.$name ?? "") + } + .frame(height: 100) + .frame(minWidth: 0, maxWidth: /*@START_MENU_TOKEN@*/.infinity/*@END_MENU_TOKEN@*/) } - .frame(height: 100) + Button( + action: { + self.visibleItems = min( + self.visibleItems + 50, + self.pokedexEntries.snapshot.count + ) + }, + label: { Text("Load more") } + ) + } + if self.service.isLoading { + Color(.sRGB, white: 0, opacity: 0.3) + .overlay( + Text("Fetching Pokedex…") + .foregroundColor(.white), + alignment: .center + ) + .edgesIgnoringSafeArea(.bottom) } } - .frame(minWidth: 0, maxWidth: /*@START_MENU_TOKEN@*/.infinity/*@END_MENU_TOKEN@*/) - .overlay( - InstructionsView( - ("Random", "Sets random coordinate"), - ("Tap", "Sets to tapped coordinate") - ) - .padding(.leading, 10) - .padding(.bottom, 40), - alignment: .bottomLeading - ) .navigationBarTitle("Pokedex") } // MARK: Private - private let service: Modern.PokedexDemo.Service = .init() + @ObservedObject + private var service: Modern.PokedexDemo.Service = .init() + + @State + private var visibleItems: Int = 50 } } diff --git a/Demo/Sources/Demos/Modern/PokedexDemo/Modern.PokedexDemo.Service.swift b/Demo/Sources/Demos/Modern/PokedexDemo/Modern.PokedexDemo.Service.swift index c112a3f..b3a5b6e 100644 --- a/Demo/Sources/Demos/Modern/PokedexDemo/Modern.PokedexDemo.Service.swift +++ b/Demo/Sources/Demos/Modern/PokedexDemo/Modern.PokedexDemo.Service.swift @@ -13,15 +13,25 @@ extension Modern.PokedexDemo { // MARK: - Modern.PokedexDemo.Service - final class Service { + final class Service: ObservableObject { // MARK: Internal - @Published - var isLoading: Bool = true - - @Published - var lastError: (error: Modern.PokedexDemo.Service.Error, retry: () -> Void)? + private(set) var isLoading: Bool = true { + + willSet { + + self.objectWillChange.send() + } + } + + private(set) var lastError: (error: Modern.PokedexDemo.Service.Error, retry: () -> Void)? { + + willSet { + + self.objectWillChange.send() + } + } init() { @@ -49,7 +59,6 @@ extension Modern.PokedexDemo { .handleEvents( receiveSubscription: { [weak self] _ in - print("Fetching Pokedex Entries") guard let self = self else { return @@ -61,7 +70,6 @@ extension Modern.PokedexDemo { .sink( receiveCompletion: { [weak self] completion in - print("Result (Fetching Pokedex Entries): \(completion)") guard let self = self else { return diff --git a/Sources/Field.Coded.swift b/Sources/Field.Coded.swift index d17e8d7..dcadfa5 100644 --- a/Sources/Field.Coded.swift +++ b/Sources/Field.Coded.swift @@ -76,10 +76,10 @@ extension FieldContainer { */ public init( wrappedValue initial: @autoclosure @escaping () -> V, - _ keyPath: KeyPathString, + _ keyPath: KeyPathString = { fatalError("'keyPath' argument required (SR-13069 workaround)") }(), versionHashModifier: @autoclosure @escaping () -> String? = nil, previousVersionKeyPath: @autoclosure @escaping () -> String? = nil, - coder fieldCoderType: Coder.Type, + coder fieldCoderType: Coder.Type = { fatalError("'coder' argument required (SR-13069 workaround)") }(), customGetter: ((_ object: ObjectProxy, _ field: ObjectProxy.FieldProxy) -> V)? = nil, customSetter: ((_ object: ObjectProxy, _ field: ObjectProxy.FieldProxy, _ newValue: V) -> Void)? = nil, affectedByKeyPaths: @autoclosure @escaping () -> Set = [] @@ -150,10 +150,10 @@ extension FieldContainer { */ public init( wrappedValue initial: @autoclosure @escaping () -> V, - _ keyPath: KeyPathString, + _ keyPath: KeyPathString = { fatalError("'keyPath' argument required (SR-13069 workaround)") }(), versionHashModifier: @autoclosure @escaping () -> String? = nil, previousVersionKeyPath: @autoclosure @escaping () -> String? = nil, - coder: (encode: (V) -> Data?, decode: (Data?) -> V), + coder: (encode: (V) -> Data?, decode: (Data?) -> V) = { fatalError("'coder' argument required (SR-13069 workaround)") }(), customGetter: ((_ object: ObjectProxy, _ field: ObjectProxy.FieldProxy) -> V)? = nil, customSetter: ((_ object: ObjectProxy, _ field: ObjectProxy.FieldProxy, _ newValue: V) -> Void)? = nil, affectedByKeyPaths: @autoclosure @escaping () -> Set = [] @@ -478,10 +478,10 @@ extension FieldContainer.Coded where V: FieldOptionalType { */ public init( wrappedValue initial: @autoclosure @escaping () -> V = nil, - _ keyPath: KeyPathString, + _ keyPath: KeyPathString = { fatalError("'keyPath' argument required (SR-13069 workaround)") }(), versionHashModifier: @autoclosure @escaping () -> String? = nil, previousVersionKeyPath: @autoclosure @escaping () -> String? = nil, - coder: Coder.Type, + coder: Coder.Type = { fatalError("'coder' argument required (SR-13069 workaround)") }(), customGetter: ((_ object: ObjectProxy, _ field: ObjectProxy.FieldProxy) -> V)? = nil, customSetter: ((_ object: ObjectProxy, _ field: ObjectProxy.FieldProxy, _ newValue: V) -> Void)? = nil, affectedByKeyPaths: @autoclosure @escaping () -> Set = [] @@ -552,10 +552,10 @@ extension FieldContainer.Coded where V: FieldOptionalType { */ public init( wrappedValue initial: @autoclosure @escaping () -> V = nil, - _ keyPath: KeyPathString, + _ keyPath: KeyPathString = { fatalError("'keyPath' argument required (SR-13069 workaround)") }(), versionHashModifier: @autoclosure @escaping () -> String? = nil, previousVersionKeyPath: @autoclosure @escaping () -> String? = nil, - coder: (encode: (V) -> Data?, decode: (Data?) -> V), + coder: (encode: (V) -> Data?, decode: (Data?) -> V) = { fatalError("'coder' argument required (SR-13069 workaround)") }(), customGetter: ((_ object: ObjectProxy, _ field: ObjectProxy.FieldProxy) -> V)? = nil, customSetter: ((_ object: ObjectProxy, _ field: ObjectProxy.FieldProxy, _ newValue: V) -> Void)? = nil, affectedByKeyPaths: @autoclosure @escaping () -> Set = [] @@ -625,7 +625,7 @@ extension FieldContainer.Coded where V: DefaultNSSecureCodable { */ public init( wrappedValue initial: @autoclosure @escaping () -> V, - _ keyPath: KeyPathString, + _ keyPath: KeyPathString = { fatalError("'keyPath' argument required (SR-13069 workaround)") }(), versionHashModifier: @autoclosure @escaping () -> String? = nil, previousVersionKeyPath: @autoclosure @escaping () -> String? = nil, customGetter: ((_ object: ObjectProxy, _ field: ObjectProxy.FieldProxy) -> V)? = nil, @@ -696,7 +696,7 @@ extension FieldContainer.Coded where V: FieldOptionalType, V.Wrapped: DefaultNSS */ public init( wrappedValue initial: @autoclosure @escaping () -> V = nil, - _ keyPath: KeyPathString, + _ keyPath: KeyPathString = { fatalError("'keyPath' argument required (SR-13069 workaround)") }(), versionHashModifier: @autoclosure @escaping () -> String? = nil, previousVersionKeyPath: @autoclosure @escaping () -> String? = nil, customGetter: ((_ object: ObjectProxy, _ field: ObjectProxy.FieldProxy) -> V)? = nil, diff --git a/Sources/Field.Stored.swift b/Sources/Field.Stored.swift index 5ecc06f..69f771d 100644 --- a/Sources/Field.Stored.swift +++ b/Sources/Field.Stored.swift @@ -69,7 +69,7 @@ extension FieldContainer { */ public init( wrappedValue initial: @autoclosure @escaping () -> V, - _ keyPath: KeyPathString, + _ keyPath: KeyPathString = { fatalError("'keyPath' argument required (SR-13069 workaround)") }(), versionHashModifier: @autoclosure @escaping () -> String? = nil, previousVersionKeyPath: @autoclosure @escaping () -> String? = nil, customGetter: ((_ object: ObjectProxy, _ field: ObjectProxy.FieldProxy) -> V)? = nil, @@ -370,7 +370,7 @@ extension FieldContainer.Stored where V: FieldOptionalType { */ public init( wrappedValue initial: @autoclosure @escaping () -> V = nil, - _ keyPath: KeyPathString, + _ keyPath: KeyPathString = { fatalError("'keyPath' argument required (SR-13069 workaround)") }(), versionHashModifier: @autoclosure @escaping () -> String? = nil, previousVersionKeyPath: @autoclosure @escaping () -> String? = nil, customGetter: ((_ object: ObjectProxy, _ field: ObjectProxy.FieldProxy) -> V)? = nil,