Получить пути к изображениям из NSBundle в Objective C? - PullRequest
7 голосов
/ 28 октября 2010

У меня есть около 60 изображений, которые я хочу сохранить в Core Data, 30 из которых являются аватарами и имеют префикс avt_filename_00X.png, а 30 из них меньше и имеют другой префикс.

Вместо того, чтобы хранить все изображения как BLOB в Core Data / SQLite, я хочу сохранить пути для каждого найденного изображения (так же, как вы сохраните пути к изображениям для базы данных MySQL).

Однако я не уверен, как получить путь к изображению, найденному в NSBundle.

Я могу получить путь к NSDocumentDirectory через:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];

NSFileManager *fileManager = [NSFileManager defaultManager];
[fileManager fileExistsAtPath:documentsDirectory];

NSLog(@"documentsDirectory = %@", documentsDirectory);

И я могу загрузить изображение и добавить его в массив.

if (qty == 0)
{
    //NSLog(@"fileToLoad = %@", fileToLoad);

    UIImage *img = [[UIImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:fileToLoad ofType:fileExt]];

    [self.avtList addObject:img];

    [img release];

} else {

    // load multiple image into an array
    // not coded yet
}

Но в чем я не уверен:

  1. Как мне найти путь, по которому компьютер нашел изображение, когда оно находилось внутри NSBundle?

  2. Как я могу быть уверен, что путь будет работать, когда приложение находится на устройстве?

Идея заключается в том, чтобы получить все изображения, хранящиеся в массиве, а затем отправить их в Core Data / SQLite позднее.

Ответы [ 2 ]

25 голосов
/ 28 октября 2010

Правильный способ получить полный путь к ресурсу в основном комплекте:

[[NSBundle mainBundle] pathForResource:@"avt_filename_00X" ofType:@"png"]

(или вы можете указать пустую строку для 'ofType', если вы предпочитаете включить расширение вимя ресурса)

Но нигде в документации не гарантируется, что путь будет одинаковым для всех устройств, итераций операционной системы и т. д. Это путь к этому файлу из комплекта приложений в текущей среде, который гарантированно останется действительнымтолько на время этого запуска приложения.

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

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

2 голосов
/ 28 октября 2010

Как я могу быть уверен, что путь будет работать, когда приложение находится на устройстве?

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

...