UIImage causes memory to run out

I have a project that currently has data saved locally and I'm trying to get it to sync over multiple devices.

Currently basic data is syncing perfectly fine, but I'm having issues getting the images to convert to data. From what I've researched it because I'm using a UIImage to convert and this caches the image

It works fine when there's only a few images, but if there's several its a pain

The associated code

    func updateLocalImages() {
        autoreleasepool {
            let fetchRequest: NSFetchRequest<Project> = Project.fetchRequest()
            fetchRequest.predicate = NSPredicate(format: "converted = %d", false)
            fetchRequest.sortDescriptors = [NSSortDescriptor(keyPath: \Project.statusOrder?.sortOrder, 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 pictures = project.pictures {
                        projectPicNumber = pictures.count
                        for pic in pictures {
                            currentPicNumber = currentPicNumber + 1
                            let picture : Picture = pic as! Picture
                            if let imgData = convertImage(picture: picture) {
                                picture.pictureData = imgData
                            }
                        }
                        project.converted = true
                        saveContext()
                    }
                }
            } catch {
                print("Fetch Failed")
            }
        }
    }
    
    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: 0.5) {
                    return imageData
                }
            }
        }
        return nil
    }```

Try this:

NSData* data = [NSData dataWithContentsOfURL:url options:NSDataReadingMappedIfSafe error:&error];

This will create a mapped region of memory instead of a private allocation.

Rico

WWDR - DTS - Software Engineer

After a bit of digging it appears the issue isn't related to to conversion itself. It's occurring when writing the data to core data.

I can resolve it by refreshing the context after each project save, but not sure if its the best way of doing it.

UIImage causes memory to run out
 
 
Q