Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //
- // UpdateScreen.swift
- // Diamond Painting Logbook
- //
- // Created by Ceri Turner on 27/01/2024.
- //
- import SwiftUI
- import CoreData
- struct UpdateScreenView: View {
- @Environment(\.managedObjectContext) private var viewContext
- @Binding var isActive: Bool
- @State private var leftToUpdate = 0
- @State private var currentProjectImage : UIImage!
- @State private var currentProjectName = ""
- @State private var currentPicNumber = 0
- @State private var projectPicNumber = 0
- private let prefs: UserDefaults = UserDefaults.standard
- var body: some View {
- VStack {
- if getHowManyProjectsToUpdate() > 0 {
- if currentProjectImage != nil {
- Image(uiImage: currentProjectImage)
- .renderingMode(.original)
- .resizable()
- .scaledToFit()
- .frame(height: 200.0)
- .border(.black)
- }
- ProgressView()
- .frame(width: 100, height: 100)
- .background(Color.white)
- .cornerRadius(20)
- .opacity(1)
- .shadow(color: Color.gray.opacity(0.5), radius: 4.0, x: 1.0, y: 2.0)
- Text("Total Projects left to Update: \(leftToUpdate)")
- Text("Current Project: \(currentProjectName)")
- Text("Picture: \(currentPicNumber) \\ \(projectPicNumber)")
- }
- }
- .onAppear() {
- DispatchQueue.global(qos: .background).async {
- while (getHowManyProjectsToUpdate() > 0) {
- leftToUpdate = getHowManyProjectsToUpdate()
- updateLocal()
- }
- if getHowManyProjectsToUpdate() == 0 {
- while (getNumberOfFilesInDocumentsDirectory() > 0) {
- deleteImagesFromDocumentsDirectory()
- }
- if getNumberOfFilesInDocumentsDirectory() == 0 {
- DispatchQueue.main.asyncAfter(deadline: .now()) {
- withAnimation {
- self.isActive = true
- }
- }
- }
- }
- }
- }
- }
- func getNumberOfFilesInDocumentsDirectory() -> Int {
- let fileManager = FileManager.default
- let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String
- let content = try? fileManager.contentsOfDirectory(atPath: path)
- return content?.count ?? 0
- }
- func deleteImagesFromDocumentsDirectory() {
- // Remove all images from Documents Directory
- let documentsUrl = URL.documentsDirectory
- do {
- let fileURLs = try FileManager.default.contentsOfDirectory(at: documentsUrl, includingPropertiesForKeys: nil, options: .skipsHiddenFiles)
- for fileURL in fileURLs {
- try FileManager.default.removeItem(at: fileURL)
- }
- } catch { print(error) }
- let fileManager = FileManager.default
- let temporaryDirectory = fileManager.temporaryDirectory
- try? fileManager
- .contentsOfDirectory(at: temporaryDirectory, includingPropertiesForKeys: nil, options: .skipsSubdirectoryDescendants)
- .forEach { file in
- try? fileManager.removeItem(atPath: file.path)
- }
- }
- func getHowManyProjectsToUpdate() -> Int {
- let fetchRequest: NSFetchRequest<Project> = Project.fetchRequest()
- fetchRequest.predicate = NSPredicate(format: "converted = %d", false)
- do {
- let pictures = try viewContext.fetch(fetchRequest)
- return pictures.count
- } catch {
- print("Fetching Failed")
- }
- return 0
- }
- func updateLocal() {
- autoreleasepool {
- let fetchRequest: NSFetchRequest<Project> = Project.fetchRequest()
- fetchRequest.predicate = NSPredicate(format: "converted = %d", false)
- fetchRequest.fetchLimit = 1
- fetchRequest.sortDescriptors = [NSSortDescriptor(keyPath: \Project.name, ascending: true), NSSortDescriptor(keyPath: \Project.name, ascending: true)]
- do {
- let projects = try viewContext.fetch(fetchRequest)
- for project in projects {
- currentPicNumber = 0
- currentProjectName = project.name ?? "Error loading project"
- if let projectMain = project.mainPicture {
- currentProjectImage = getUIImage(picture: projectMain)
- }
- if let pictures = project.pictures {
- projectPicNumber = pictures.count
- // Get main image
- if let projectMain = project.mainPicture {
- if let imgThumbData = convertImageThumb(picture: projectMain) {
- project.mainPictureData = imgThumbData
- }
- }
- while (getTotalImagesToConvertForProject(project: project ) > 0) {
- convertImageBatch(project: project)
- }
- project.converted = true
- saveContext()
- viewContext.refreshAllObjects()
- }
- }
- } catch {
- print("Fetch Failed")
- }
- }
- }
- func getTotalImagesToConvertForProject(project: Project) -> Int {
- let fetchRequestPic: NSFetchRequest<Picture> = Picture.fetchRequest()
- let projectPredicate = NSPredicate(format: "project = %@", project)
- let dataPredicate = NSPredicate(format: "pictureData == NULL")
- fetchRequestPic.predicate = NSCompoundPredicate(andPredicateWithSubpredicates: [projectPredicate, dataPredicate])
- do {
- let pictures = try viewContext.fetch(fetchRequestPic)
- return pictures.count
- } catch {
- print("Fetching Failed")
- }
- return 0
- }
- func convertImageBatch(project: Project) {
- autoreleasepool {
- let fetchRequestPic: NSFetchRequest<Picture> = Picture.fetchRequest()
- let projectPredicate = NSPredicate(format: "project = %@", project)
- let dataPredicate = NSPredicate(format: "pictureData == NULL")
- fetchRequestPic.predicate = NSCompoundPredicate(andPredicateWithSubpredicates: [projectPredicate, dataPredicate])
- fetchRequestPic.fetchLimit = 5
- fetchRequestPic.sortDescriptors = [NSSortDescriptor(keyPath: \Picture.dateTaken, ascending: true)]
- do {
- let pictures = try viewContext.fetch(fetchRequestPic)
- for picture in pictures {
- currentPicNumber = currentPicNumber + 1
- if let imgData = convertImage(picture: picture), let imgThumbData = convertImageThumb(picture: picture) {
- // Save Converted
- picture.pictureData = imgData
- picture.pictureThumbnailData = imgThumbData
- // Save Image
- saveContext()
- viewContext.refreshAllObjects()
- } else {
- viewContext.delete(picture)
- saveContext()
- viewContext.refreshAllObjects()
- }
- }
- } catch {
- print("Fetch Failed")
- }
- }
- }
- func getUIImage(picture : Picture)-> UIImage? {
- let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
- let path = paths[0]
- if let picName = picture.pictureName {
- let imagePath = path.appendingPathComponent(picName)
- if let uiImage = UIImage(contentsOfFile: imagePath.path) {
- return uiImage
- }
- }
- return nil
- }
- func deleteImage(fileName: String) {
- let fileManager = FileManager.default
- do {
- let filePath = (NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as NSString).appendingPathComponent(fileName)
- if fileManager.fileExists(atPath: filePath){
- guard let url = URL(string: filePath) else { return }
- try fileManager.removeItem(at: url)
- }
- } catch {
- print(error)
- }
- }
- func convertImage(picture : Picture)-> Data? {
- let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
- let path = paths[0]
- if let picName = picture.pictureName {
- let imagePath = path.appendingPathComponent(picName)
- if let uiImage = UIImage(contentsOfFile: imagePath.path) {
- if let imageData = uiImage.jpegData(compressionQuality: 1) {
- return imageData
- }
- }
- }
- return nil
- }
- func convertImageThumb(picture : Picture)-> Data? {
- let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
- let path = paths[0]
- if let picName = picture.pictureName {
- let imagePath = path.appendingPathComponent(picName)
- if let uiImage = UIImage(contentsOfFile: imagePath.path) {
- let resized = uiImage.scale(newWidth: 300)
- if let imageData = resized.jpegData(compressionQuality: 1) {
- return imageData
- }
- }
- }
- return nil
- }
- func saveContext() {
- do {
- try viewContext.save()
- } catch {
- let nsError = error as NSError
- fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement