From dfd49de8d10fa5d8d45fe5316b3ed8e765741aae Mon Sep 17 00:00:00 2001 From: Riley Testut Date: Mon, 18 Apr 2022 15:31:29 -0700 Subject: [PATCH] Replaces PatreonAccount.isFriendZone with ManagedPatron MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rather than store both the current user’s Patreon account and all cached Friend Zone patrons in the same table, we now store Friend Zone patrons in the new ManagedPatron table. This avoids the need to distinguish between the two at runtime. --- .../Operations/UpdatePatronsOperation.swift | 23 ++++++------------- AltStore/Settings/PatreonViewController.swift | 15 ++++++------ .../AltStore 9.xcdatamodel/contents | 3 +-- AltStoreCore/Model/PatreonAccount.swift | 11 --------- AltStoreCore/Patreon/PatreonAPI.swift | 6 ++--- 5 files changed, 17 insertions(+), 41 deletions(-) diff --git a/AltStore/Operations/UpdatePatronsOperation.swift b/AltStore/Operations/UpdatePatronsOperation.swift index c4d6301f..54000883 100644 --- a/AltStore/Operations/UpdatePatronsOperation.swift +++ b/AltStore/Operations/UpdatePatronsOperation.swift @@ -70,24 +70,15 @@ class UpdatePatronsOperation: ResultOperation do { let patrons = try result.get() - let managedPatrons = patrons.map { (patron) -> PatreonAccount in - let account = PatreonAccount(patron: patron, context: self.context) - account.isFriendZonePatron = true - return account - } + let managedPatrons = patrons.map { ManagedPatron(patron: $0, context: self.context) } - var patronIDs = Set(managedPatrons.map { $0.identifier }) - if let userAccountID = Keychain.shared.patreonAccountID + let patronIDs = Set(managedPatrons.map { $0.identifier }) + let nonFriendZonePredicate = NSPredicate(format: "NOT (%K IN %@)", #keyPath(ManagedPatron.identifier), patronIDs) + + let nonFriendZonePatrons = ManagedPatron.all(satisfying: nonFriendZonePredicate, in: self.context) + for managedPatron in nonFriendZonePatrons { - // Insert userAccountID into patronIDs to prevent it from being deleted. - patronIDs.insert(userAccountID) - } - - let removedPredicate = NSPredicate(format: "NOT (%K IN %@)", #keyPath(PatreonAccount.identifier), patronIDs) - let removedPatrons = PatreonAccount.all(satisfying: removedPredicate, in: self.context) - for patreonAccount in removedPatrons - { - self.context.delete(patreonAccount) + self.context.delete(managedPatron) } try self.context.save() diff --git a/AltStore/Settings/PatreonViewController.swift b/AltStore/Settings/PatreonViewController.swift index 8dc4e37b..10d0e5d2 100644 --- a/AltStore/Settings/PatreonViewController.swift +++ b/AltStore/Settings/PatreonViewController.swift @@ -75,24 +75,23 @@ class PatreonViewController: UICollectionViewController private extension PatreonViewController { - func makeDataSource() -> RSTCompositeCollectionViewDataSource + func makeDataSource() -> RSTCompositeCollectionViewDataSource { - let aboutDataSource = RSTDynamicCollectionViewDataSource() + let aboutDataSource = RSTDynamicCollectionViewDataSource() aboutDataSource.numberOfSectionsHandler = { 1 } aboutDataSource.numberOfItemsHandler = { _ in 0 } - let dataSource = RSTCompositeCollectionViewDataSource(dataSources: [aboutDataSource, self.patronsDataSource]) + let dataSource = RSTCompositeCollectionViewDataSource(dataSources: [aboutDataSource, self.patronsDataSource]) dataSource.proxy = self return dataSource } - func makePatronsDataSource() -> RSTFetchedResultsCollectionViewDataSource + func makePatronsDataSource() -> RSTFetchedResultsCollectionViewDataSource { - let fetchRequest: NSFetchRequest = PatreonAccount.fetchRequest() - fetchRequest.predicate = NSPredicate(format: "%K == YES", #keyPath(PatreonAccount.isFriendZonePatron)) - fetchRequest.sortDescriptors = [NSSortDescriptor(key: #keyPath(PatreonAccount.name), ascending: true, selector: #selector(NSString.caseInsensitiveCompare(_:)))] + let fetchRequest: NSFetchRequest = ManagedPatron.fetchRequest() + fetchRequest.sortDescriptors = [NSSortDescriptor(key: #keyPath(ManagedPatron.name), ascending: true, selector: #selector(NSString.caseInsensitiveCompare(_:)))] - let patronsDataSource = RSTFetchedResultsCollectionViewDataSource(fetchRequest: fetchRequest, managedObjectContext: DatabaseManager.shared.viewContext) + let patronsDataSource = RSTFetchedResultsCollectionViewDataSource(fetchRequest: fetchRequest, managedObjectContext: DatabaseManager.shared.viewContext) patronsDataSource.cellConfigurationHandler = { (cell, patron, indexPath) in let cell = cell as! PatronCollectionViewCell cell.textLabel.text = patron.name diff --git a/AltStoreCore/Model/AltStore.xcdatamodeld/AltStore 9.xcdatamodel/contents b/AltStoreCore/Model/AltStore.xcdatamodeld/AltStore 9.xcdatamodel/contents index 7589e6f7..ff5a5907 100644 --- a/AltStoreCore/Model/AltStore.xcdatamodeld/AltStore 9.xcdatamodel/contents +++ b/AltStoreCore/Model/AltStore.xcdatamodeld/AltStore 9.xcdatamodel/contents @@ -87,7 +87,6 @@ - @@ -178,7 +177,7 @@ - + diff --git a/AltStoreCore/Model/PatreonAccount.swift b/AltStoreCore/Model/PatreonAccount.swift index 63980931..95259c1e 100644 --- a/AltStoreCore/Model/PatreonAccount.swift +++ b/AltStoreCore/Model/PatreonAccount.swift @@ -38,7 +38,6 @@ public class PatreonAccount: NSManagedObject, Fetchable @NSManaged public var firstName: String? @NSManaged public var isPatron: Bool - @NSManaged public var isFriendZonePatron: NSNumber? private override init(entity: NSEntityDescription, insertInto context: NSManagedObjectContext?) { @@ -63,16 +62,6 @@ public class PatreonAccount: NSManagedObject, Fetchable self.isPatron = false } } - - public init(patron: Patron, context: NSManagedObjectContext) - { - super.init(entity: PatreonAccount.entity(), insertInto: context) - - self.identifier = patron.identifier - self.name = patron.name - self.firstName = nil - self.isPatron = (patron.status == .active) - } } public extension PatreonAccount diff --git a/AltStoreCore/Patreon/PatreonAPI.swift b/AltStoreCore/Patreon/PatreonAPI.swift index 96a87a1e..74b259b2 100644 --- a/AltStoreCore/Patreon/PatreonAPI.swift +++ b/AltStoreCore/Patreon/PatreonAPI.swift @@ -246,10 +246,8 @@ public extension PatreonAPI DatabaseManager.shared.persistentContainer.performBackgroundTask { (context) in do { - if let account = DatabaseManager.shared.patreonAccount(in: context) - { - context.delete(account) - } + let accounts = PatreonAccount.all(in: context, requestProperties: [\.returnsObjectsAsFaults: true]) + accounts.forEach(context.delete(_:)) self.deactivateBetaApps(in: context)