// import UIKit import Alamofire import CoreData enum LoaderError:String{ case JsonFailed, PathFailed, NoEntityDescription, UnknownError } enum DbTable:String{ case VehiclesEntity, PhotosEntity, ModelsEntity, NewsEntity, StylesEntity } class UpdateDbClass { static func updateDatabase(entityName:String,completionHandler: @escaping () -> Void){ var url = URL(string: UrlRepository.VehiclesJsonUrl!)! var table = "" switch entityName { case DbTable.VehiclesEntity.rawValue: table = "Vehicles" url = URL(string: UrlRepository.VehiclesJsonUrl!)! case DbTable.PhotosEntity.rawValue: table = "Photos" url = URL(string: UrlRepository.PhotosJsonUrl!)! table = "Styles" url = Bundle.main.url(forResource: "Styles", withExtension: "json")! // url = URL(string: UrlRepository.NewsJsonUrl!)! default: break } let uuid = UUID().uuidString let parameters: Parameters = [ "id": uuid ] let queue = DispatchQueue(label: "com.my.test", qos: .background, attributes: .concurrent) AF.request(url, method: .get, parameters: parameters, encoding: URLEncoding(destination: .queryString), headers: nil).responseJSON(queue:queue){ response in switch response.result { case let .success(value): if let items = value as? [[String: Any]] { var itemsArray:[Int32] = [] for item in items{ if let id = item["id"] as? Int32{ itemsArray.append(id) } } guard let entity = NSEntityDescription.entity(forEntityName: table, in:(CoreDataStack.sharedManager.mainObjectContext)) else { fatalError("Could not find entity descriptions!") } switch entityName { case DbTable.StylesEntity.rawValue: //Styles checkDeletedRecords(jsonItems: itemsArray,table: table) for item in items{ guard let id = item["id"] as? Int32 else {return} //Check if not exists if !CheckIfExists(id: id,table:table){ print("id \(id) does not exist") //Insert Record let object = Styles(entity: entity, insertInto: CoreDataStack.sharedManager.mainObjectContext) object.setValue(item["id"], forKey: "id") object.setValue(item["style"] as! String, forKey: "style") object.setValue(item["image"] as! String, forKey: "image") CoreDataStack.sharedManager.saveMainContext() } else{ //Update Record // print("id \(item["id"]) exists") do{ let fetchRequest = NSFetchRequest<Styles>(entityName:"Styles") let predicate = NSPredicate(format: "id == %d",item["id"] as! Int32) fetchRequest.predicate = predicate let req = try CoreDataStack.sharedManager.mainObjectContext.fetch(fetchRequest) let object = req[0] as NSManagedObject object.setValue(item["style"] as! String, forKey: "style") object.setValue(item["image"] as! String, forKey: "image") CoreDataStack.sharedManager.saveMainContext() }catch{ print("there was an error") } completionHandler() } } break; default: break } } break case let .failure(error): print(error as NSError) break } } } } protocol CoreDataWorkerProtocol { associatedtype EntityType } enum VoidResult { case success case failure(NSError) }