Search code examples
iosobjective-cxcodeuiimagewritetofile

Image written through WriteToFile command is missing after app rerun


I am writing an app which downloads image from my server and stores them locally for offline viewing. The codes I use to store the image locally are shown below. Apart from storing the image, I am also able to read the image from the path (which I stored separately).

However when I re-run my code from Xcode to the iPhone (without uninstalling the app from the phone), the stored image file would be missing. Is this expected? Would I face similar issue when my app has been released on App Store and when the user updates the app? Is there a way to keep the file persistent when I re-run them when I update some codes in Xcode?

        NSData *imageData = UIImageJPEGRepresentation(image, 1.0);
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0];            
        NSString *imagePath =[documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"file.jpeg",]];

        if (![imageData writeToFile:imagePath atomically:YES])
        {
           // Handling when there is an error
           NSLog(@"Failed to store file at path %@",imagePath);
           stored.text = @""; 
        }
        else
        {  // Handling when write is successful
           NSLog(@"Imaged stored path is %@",imagePath);
           stored.text = imagePath;
        }
        [imageView setImage:image];

The code to read the image is shown below:

        NSString *imagePathToRead = stored.text; 
        NSLog(@"Retrieve image from %@",imagePathToRead);
        UIImage *image = [UIImage imageWithContentsOfFile:imagePathToRead];

        [imageView setImage:image];

Solution

  • I am posting the answer here from rmaddy which solved the issue I was facing. I am posting here so that others can benefit if they are facing similar issue.

    For the storing portion:

    The stored.text should never store the full path:

          stored.text = imagePath;
    

    Instead I should store @"file.jpeg" only.

    For the Read portion:

    I should always regenerate the full path below when I wanted to read the path instead of the code below:

          NSString *imagePathToRead = stored.text; 
    

    The corrected codes are:

        NSString *imagePathToRead = stored.text; 
    
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0];            
        NSString *imagePath =[documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:imagePathToRead]];
    
        NSLog(@"Retrieve image from %@",imagePath);
        UIImage *image = [UIImage imageWithContentsOfFile:imagePath];
    

    This solved the issue and the image is able to be read even though the app is re-installed through Xcode.