Advertisement
greedydev

Untitled

Apr 5th, 2023
1,383
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Swift 1.87 KB | None | 0 0
  1. import Foundation
  2.  
  3. enum PersistenceActionType {
  4.     case add, remove
  5. }
  6.  
  7. enum PersistenceManager {
  8.     static private let defaults = UserDefaults.standard
  9.     enum Keys { static let favorites = "favorites" }
  10.    
  11.    
  12.     static func updateWith(favorite: Post, actionType: PersistenceActionType, completed: @escaping (RCError?) -> Void) {
  13.         retrieveFavorites { result in
  14.             switch result {
  15.             case .success(var favorites):
  16.                 switch actionType {
  17.                 case .add:
  18.                     guard !favorites.contains(favorite) else {
  19.                         completed(.alreadyInFavorites)
  20.                         return
  21.                     }
  22.                     favorites.append(favorite)
  23.                 case .remove:
  24.                     favorites.removeAll { $0.data.id == favorite.data.id }
  25.                 }
  26.                
  27.                 completed(save(favorites: favorites))
  28.                
  29.             case .failure(let error):
  30.                 completed(error)
  31.             }
  32.         }
  33.     }
  34.    
  35.    
  36.     static func retrieveFavorites(completed: @escaping (Result<[Post], RCError>) -> Void) {
  37.         guard let favoritesData = defaults.object(forKey: Keys.favorites) as? Data else {
  38.             completed(.success([]))
  39.             return
  40.         }
  41.        
  42.         do {
  43.             let decoder = JSONDecoder()
  44.             let favorites = try decoder.decode([Post].self, from: favoritesData)
  45.             completed(.success(favorites))
  46.         } catch {
  47.             completed(.failure(.unableToFavorite))
  48.         }
  49.     }
  50.    
  51.    
  52.     static func save(favorites: [Post]) -> RCError? {
  53.         do {
  54.             let encoder = JSONEncoder()
  55.             let encodedFavorites = try encoder.encode(favorites)
  56.             defaults.set(encodedFavorites, forKey: Keys.favorites)
  57.             return nil
  58.         } catch {
  59.             return .unableToFavorite
  60.         }
  61.     }
  62. }
  63.  
  64.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement