iPhone UIImage — сохранение данных

Простой вопрос о сохранении данных между сеансами приложений.

Мое приложение позволяет пользователю выбирать изображение из библиотеки с помощью UIImagePickerController. Выбранная фотография затем используется в качестве фона для приложения.

Поскольку метод делегата UIImagePickerController фактически возвращает изображение, а не путь к изображению, мне интересно, как лучше всего сохранить это изображение в пользовательских сеансах?

В данный момент мне не нужно сохранять какие-либо другие данные, так как все остальное загружается из SQL Server, но я не хочу дополнительных накладных расходов, связанных с необходимостью хранения изображения на сервере, что означало бы, что каждый раз, когда пользователь открыл приложение, фоновое изображение сначала должно быть загружено с сервера в массив байтов, а затем преобразовано в изображение.

Я нашел следующий код, который может сохранить изображение:

- (void)saveImage:(UIImage *)image withName:(NSString *)name {
//save image
NSData *data = UIImageJPEGRepresentation(image, 1.0);
NSFileManager *fileManager = [NSFileManager defaultManager];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,  YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:name];
[fileManager createFileAtPath:fullPath contents:data attributes:nil];

}

В данный момент у меня нет Mac, поэтому я не могу протестировать этот код, но у меня есть пара вопросов относительно приведенного выше кода:

Я не хочу, чтобы много файлов загромождали файловую систему. Поэтому мне нужен один фоновый файл (background.png); как приведенный выше код справится с ситуацией, когда этот файл уже существует?

Будет ли он перезаписывать существующий файл или выдаст ошибку?

Как мне снова загрузить изображение?


person Mick Walker    schedule 24.11.2009    source источник


Ответы (1)


Сначала вы должны удалить файл:

- (void)saveImage:(UIImage *)image withName:(NSString *)name {
    //save image
    NSData *data = UIImageJPEGRepresentation(image, 1.0);
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                                         NSUserDomainMask,  YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:name];

    NSError *error = nil;
    if( [fileManager fileExistsAtPath:fullPath] ){
        if( ! [fileManager removeItemAtPath:fullPath error:&error] ) {
            NSLog(@"Failed deleting background image file %@", error);
            // the write below should fail. Add your own flag and check below.
        }
    }
    [data writeToFile:fullPath atomically:YES];
}

Обратное чтение должно работать следующим образом:

...
UIImage *bgImage = [UIImage imageWithContentsOfFile:fullPath];
...
person wkw    schedule 24.11.2009