2015-11-25 2 views
0

Я создал NSManagedObject* imagesArrayData, который хранит струнные (пути) к изображениям, хранящимся в каталоге документов:Receiveing ​​массив изображений из CoreData

- (void)setImagesArray:(NSMutableArray *)imagesArray { 
    NSMutableArray* newImagesArray = [NSMutableArray new]; 
    int i = 1; 
    for (UIImage* image in imagesArray) { 
     //generate path to createdFile 
     NSString* fileName = [NSString stringWithFormat:@"%@_%d", self.name, i]; 
     NSString* filePath = [self documentsPathForFileName:fileName]; 
     //save image to disk 
     NSData *imageData = UIImagePNGRepresentation(image); 
     [imageData writeToFile:filePath atomically:YES]; 

     //add image path to CoreData 
     [newImagesArray addObject:filePath]; 

     i++; 
    } 

    //set new value of imagesArray 
    imagesArrayData = [NSKeyedArchiver archivedDataWithRootObject:newImagesArray]; 

Я теперь не показывая pathsToImages в заголовочном файле, но свойство imagesArray:

-(NSMutableArray*) imagesArray { 
     NSMutableArray* images = [NSMutableArray new]; 
     NSArray* imagePaths = [NSKeyedUnarchiver unarchiveObjectWithData:imagesArrayData]; 
     for (NSString* imagePath in imagePaths) { 
      UIImage *image = [[UIImage alloc] initWithContentsOfFile: imagePath]; 
      [images addObject:image]; 
     } 
     return images; 

проблема заключается в том, что всякий раз, когда я хочу, чтобы добраться до [imagesArray objectatIndex:xxx] Поглотителя imagesArray называется, и это занимает много времени, чтобы воссоздать полный массив. При попытке переключения между изображениями пользовательский интерфейс замедляется. Каким будет элегантный способ преодолеть эту проблему? Может быть, создать еще один массив, полный изображений и время от времени обновляющий его? Может быть, что-то еще? Пожалуйста помоги.

ответ

1

Одна вещь, которую вы могли бы сделать, - это реорганизовать ваш геттер, чтобы лениво загрузить массив. Если он уже определен, просто верните его. Если нет, постройте его:

-(NSMutableArray*) imagesArray 
{ 
    if (!_imagesArray) 
    { 
    NSMutableArray* _imagesArray = [NSMutableArray new]; 
    NSArray* imagePaths = 
     [NSKeyedUnarchiver unarchiveObjectWithData: imagesArrayData]; 
    for (NSString* imagePath in imagePaths) 
    { 
     UIImage *image = [[UIImage alloc] initWithContentsOfFile: imagePath]; 
    [_imagesArray addObject:image]; 
    } 
    return _imagesArray; 
} 

Я не уверен, что вы хотите обновить массив изображений время от времени.

Если ваш массив имен изображений изменяется, вам понадобится какой-либо метод для ответа на эти изменения.

+0

Звучит просто и удобно, но я получаю ошибку при вводе _imagesArray - использование необъявленного идентификатора. У меня есть свойство (неатомное, сохранение) NSMutableArray * imagesArray; в моем * .h файле, но в * .m Я использую atdynamic imagesArray. Я не уверен, но при использовании atdynamic я не могу использовать «_variable» нотацию. Когда меняют на self.imagesArray, я перехожу в бесконечный цикл getArray. – izik461

+0

Если вы используете @dynamic, тогда вам нужно создать переменную частного экземпляра, которая называется _imagesArray. Просто добавьте объявление в свой файл заголовка. И вы используете «сохранить»? Почему вы используете ручной подсчет ссылок? Он должен быть «(неатомным, сильным»), если вы используете ARC. –

+0

Я сделал то, что вы предложили, и он работает красиво. Я не использую удержание. Благодаря! – izik461

Смежные вопросы