从CoreData

时间:2015-11-25 11:33:45

标签: ios arrays image core-data

我创建了NSManagedObject* imagesArrayData,它将字符串(路径)存储到文档目录中存储的图像中:

- (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 getter,并且重新创建完整数组需要时间。当尝试在图像之间快速切换时,UI会变慢。 克服这个问题的优雅方法是什么?也许创建另一个充满图像的数组并不时更新它?也许别的什么?请帮忙。

1 个答案:

答案 0 :(得分:1)

你可以做的一件事是重构你的getter懒惰地加载数组。如果已经定义,只需返回它。如果没有,建立它:

-(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;
}

我不确定你不时更新图像数组的意思。

如果您的图像名称数组发生变化,您将需要一些方法来响应这些变化。