From 00e8b7c80e3388b23dcaf400a70ab79eeb7e7197 Mon Sep 17 00:00:00 2001 From: Riley Testut Date: Mon, 5 Oct 2020 14:23:19 -0700 Subject: [PATCH] Adds @Managed property wrapper MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit • Keeps strong reference to wrapped managed object’s context. • Projected value simplifies accessing properties on context’s thread. --- AltStore.xcodeproj/project.pbxproj | 4 +++ AltStore/Types/Managed.swift | 49 ++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 AltStore/Types/Managed.swift diff --git a/AltStore.xcodeproj/project.pbxproj b/AltStore.xcodeproj/project.pbxproj index bae69928..ef1e33bc 100644 --- a/AltStore.xcodeproj/project.pbxproj +++ b/AltStore.xcodeproj/project.pbxproj @@ -226,6 +226,7 @@ BFAECC5F2501B0BF00528F27 /* ALTConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = BFD52BD222A06EFB000B7ED1 /* ALTConstants.h */; settings = {ATTRIBUTES = (Public, ); }; }; BFAECC602501B0BF00528F27 /* NSError+ALTServerError.h in Headers */ = {isa = PBXBuildFile; fileRef = BF1E314822A060F400370A3C /* NSError+ALTServerError.h */; settings = {ATTRIBUTES = (Public, ); }; }; BFB3645A2325985F00CD0EB1 /* FindServerOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFB364592325985F00CD0EB1 /* FindServerOperation.swift */; }; + BFB39B5C252BC10E00D1BE50 /* Managed.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFB39B5B252BC10E00D1BE50 /* Managed.swift */; }; BFB4323F22DE852000B7F8BC /* UpdateCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = BFB4323E22DE852000B7F8BC /* UpdateCollectionViewCell.xib */; }; BFB49AAA23834CF900D542D9 /* ALTAnisetteData.m in Sources */ = {isa = PBXBuildFile; fileRef = BFB49AA823834CF900D542D9 /* ALTAnisetteData.m */; }; BFB6B21E231870160022A802 /* NewsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFB6B21D231870160022A802 /* NewsViewController.swift */; }; @@ -655,6 +656,7 @@ BFA8172A23C5633D001B5953 /* FetchAnisetteDataOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FetchAnisetteDataOperation.swift; sourceTree = ""; }; BFB1169C22932DB100BB457C /* apps.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = apps.json; sourceTree = ""; }; BFB364592325985F00CD0EB1 /* FindServerOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FindServerOperation.swift; sourceTree = ""; }; + BFB39B5B252BC10E00D1BE50 /* Managed.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Managed.swift; sourceTree = ""; }; BFB4323E22DE852000B7F8BC /* UpdateCollectionViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = UpdateCollectionViewCell.xib; sourceTree = ""; }; BFB49AA823834CF900D542D9 /* ALTAnisetteData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ALTAnisetteData.m; path = "Dependencies/AltSign/AltSign/Model/Apple API/ALTAnisetteData.m"; sourceTree = SOURCE_ROOT; }; BFB49AA923834CF900D542D9 /* ALTAnisetteData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ALTAnisetteData.h; path = "Dependencies/AltSign/AltSign/Model/Apple API/ALTAnisetteData.h"; sourceTree = SOURCE_ROOT; }; @@ -901,6 +903,7 @@ isa = PBXGroup; children = ( BF41B807233433C100C593A3 /* LoadingState.swift */, + BFB39B5B252BC10E00D1BE50 /* Managed.swift */, ); path = Types; sourceTree = ""; @@ -2387,6 +2390,7 @@ BFF0B69A2322D7D0007A79E1 /* UIScreen+CompactHeight.swift in Sources */, BF8F69C222E659F700049BA1 /* AppContentViewController.swift in Sources */, BF08858522DE7EC800DE9F1E /* UpdateCollectionViewCell.swift in Sources */, + BFB39B5C252BC10E00D1BE50 /* Managed.swift in Sources */, BF770E5822BC3D0F002A40FE /* RefreshGroup.swift in Sources */, BF18B0F122E25DF9005C4CF5 /* ToastView.swift in Sources */, BF3D649F22E7B24C00E9056B /* CollapsingTextView.swift in Sources */, diff --git a/AltStore/Types/Managed.swift b/AltStore/Types/Managed.swift new file mode 100644 index 00000000..1bce7bb4 --- /dev/null +++ b/AltStore/Types/Managed.swift @@ -0,0 +1,49 @@ +// +// Managed.swift +// AltStore +// +// Created by Riley Testut on 10/5/20. +// Copyright © 2020 Riley Testut. All rights reserved. +// + +import Foundation +import CoreData + +@propertyWrapper @dynamicMemberLookup +struct Managed +{ + var wrappedValue: ManagedObject { + didSet { + self.managedObjectContext = self.wrappedValue.managedObjectContext + } + } + private var managedObjectContext: NSManagedObjectContext? + + var projectedValue: Managed { + return self + } + + init(wrappedValue: ManagedObject) + { + self.wrappedValue = wrappedValue + self.managedObjectContext = wrappedValue.managedObjectContext + } + + subscript(dynamicMember keyPath: KeyPath) -> T + { + var result: T! + + if let context = self.managedObjectContext + { + context.performAndWait { + result = self.wrappedValue[keyPath: keyPath] + } + } + else + { + result = self.wrappedValue[keyPath: keyPath] + } + + return result + } +}