From 108a02826f276cc9d8fd2f2419cdeed5b3fe9474 Mon Sep 17 00:00:00 2001 From: Shadowfacts Date: Mon, 4 Dec 2023 16:20:22 -0500 Subject: [PATCH] Remove incorrect workaround for crash when LazilyDecoding used on nil MO --- Tusker/LazilyDecoding.swift | 66 +++++++++++++++---------------------- 1 file changed, 26 insertions(+), 40 deletions(-) diff --git a/Tusker/LazilyDecoding.swift b/Tusker/LazilyDecoding.swift index 26fec37a..16c291c8 100644 --- a/Tusker/LazilyDecoding.swift +++ b/Tusker/LazilyDecoding.swift @@ -33,41 +33,37 @@ public struct LazilyDecoding { public static subscript(_enclosingInstance instance: Enclosing, wrapped wrappedKeyPath: ReferenceWritableKeyPath, storage storageKeyPath: ReferenceWritableKeyPath) -> Value { get { - instance.performOnContext { - var wrapper = instance[keyPath: storageKeyPath] - if let value = wrapper.value { - return value - } else { - guard let data = instance[keyPath: wrapper.keyPath] else { return wrapper.fallback } - do { - let value = try decoder.decode(Box.self, from: data) - wrapper.value = value.value - wrapper.observation = instance.observe(wrapper.keyPath, changeHandler: { instance, _ in - var wrapper = instance[keyPath: storageKeyPath] - if wrapper.skipClearingOnNextUpdate { - wrapper.skipClearingOnNextUpdate = false - } else { - wrapper.removeCachedValue() - } - instance[keyPath: storageKeyPath] = wrapper - }) + var wrapper = instance[keyPath: storageKeyPath] + if let value = wrapper.value { + return value + } else { + guard let data = instance[keyPath: wrapper.keyPath] else { return wrapper.fallback } + do { + let value = try decoder.decode(Box.self, from: data) + wrapper.value = value.value + wrapper.observation = instance.observe(wrapper.keyPath, changeHandler: { instance, _ in + var wrapper = instance[keyPath: storageKeyPath] + if wrapper.skipClearingOnNextUpdate { + wrapper.skipClearingOnNextUpdate = false + } else { + wrapper.removeCachedValue() + } instance[keyPath: storageKeyPath] = wrapper - return value.value - } catch { - return wrapper.fallback - } + }) + instance[keyPath: storageKeyPath] = wrapper + return value.value + } catch { + return wrapper.fallback } } } set { - instance.performOnContext { - var wrapper = instance[keyPath: storageKeyPath] - wrapper.value = newValue - wrapper.skipClearingOnNextUpdate = true - instance[keyPath: storageKeyPath] = wrapper - let newData = try! encoder.encode(Box(value: newValue)) - instance[keyPath: wrapper.keyPath] = newData - } + var wrapper = instance[keyPath: storageKeyPath] + wrapper.value = newValue + wrapper.skipClearingOnNextUpdate = true + instance[keyPath: storageKeyPath] = wrapper + let newData = try! encoder.encode(Box(value: newValue)) + instance[keyPath: wrapper.keyPath] = newData } } @@ -78,16 +74,6 @@ public struct LazilyDecoding { } -extension NSManagedObject { - fileprivate func performOnContext(_ f: () -> V) -> V { - if let managedObjectContext { - managedObjectContext.performAndWait(f) - } else { - f() - } - } -} - extension LazilyDecoding { init(arrayFrom keyPath: ReferenceWritableKeyPath) where Value == [T] { self.init(from: keyPath, fallback: [])