在 Core Data 中从库中保存和获取多个图像选择

Posted

技术标签:

【中文标题】在 Core Data 中从库中保存和获取多个图像选择【英文标题】:Saving and fetching Multiple Image Selection From Library in Core Data 【发布时间】:2015-07-14 13:01:06 【问题描述】:

我正在构建一个项目,我在其中使用 ELCImagepickerController 进行多项选择,然后将这些选定的图像保存到核心数据中。现在我在另一个 VC 中获取这些图像并将它们显示到 UICollectionView 中。

但我在这里面临的问题是图像在 collectionView 中没有正确显示。我有两个困惑。

图像是否正确保存到核心数据中。 如果图像已保存,则是否正确获取。

我在这里将选定的图像输入到核心数据中

- (void)imagePicker:(SNImagePickerNC *)imagePicker didFinishPickingWithMediaInfo:(NSMutableArray *)info


    _arrImages = [[NSMutableArray alloc]init];
    _imgdata = [[NSMutableData alloc]init];
    AppDelegate* app=(AppDelegate*)[[UIApplication sharedApplication]delegate];
    NSManagedObjectContext *context = app.managedObjectContext;

    Albums *objPhotos = (Albums *)[NSEntityDescription insertNewObjectForEntityForName:@"Albums" inManagedObjectContext:context];

//get images
    for (int i = 0; i < info.count; i++) 
        ALAssetsLibrary *assetLibrary=[[ALAssetsLibrary alloc] init];
        [assetLibrary assetForURL:info[i] resultBlock:^(ALAsset *asset) 
        UIImage *image = [UIImage imageWithCGImage:[asset aspectRatioThumbnail]];
         _imageData = [NSData dataWithData:UIImagePNGRepresentation(image)];
        [objPhotos setPhotosInAlbum:self.imageData];



     failureBlock:^(NSError *error)      ];

 NSError * err = nil;
[context save:&err];


if (![context save:&err]) 
    NSLog(@"Can't Save! %@ %@", err, [err localizedDescription]);

UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Success!!" message:@"Photos Successfully Selected!" delegate:self cancelButtonTitle:@"DONE" otherButtonTitles:nil];
[alert show];

 

我在这里获取那些选定的图像

-(NSArray *)getMenCategoryList

    AppDelegate* app=(AppDelegate*)[[UIApplication sharedApplication]delegate];
    NSManagedObjectContext *moc=app.managedObjectContext;
    NSFetchRequest *fetch = [[NSFetchRequest alloc] init];

    NSEntityDescription *entity =  [NSEntityDescription entityForName:@"Albums" inManagedObjectContext:moc];
    [fetch setEntity:entity];
    NSError *error;
    NSArray *result = [moc executeFetchRequest:fetch error:&error];
    if (!result) 
        return nil;
    
    return result;

我在- (NSInteger) collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section中调用获取函数并返回数组计数

- (NSInteger) collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section


    return [[self getMenCategoryList] count];

最后,在此处将图像填充到 collectionView 中

- (UICollectionViewCell *) collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath

     UICollectionViewCell *cell = (UICollectionViewCell *)[collectionView dequeueReusableCellWithReuseIdentifier:@"albumCollectionViewCellCell" forIndexPath:indexPath];



    Photos *objAlbumPhotos = (Photos *)[[self getMenCategoryList] objectAtIndex:indexPath.row];

    UIImage *albumImg = [UIImage imageWithData:[objAlbumPhotos valueForKey:@"photosInAlbum"]];
    UIImageView *photosimageview = (UIImageView *)[cell.contentView viewWithTag:1];
    photosimageview.image = albumImg;



    return cell;

非常感谢任何帮助。

【问题讨论】:

嘿,为什么要将图像保存到 coredata 中?创建一个目录并将所有图像以唯一名称保存到该目录,并将该图像保存到您的核心数据中。这很容易和简单。 你能告诉我怎么做吗?请! @MitulBhadeshiya 【参考方案1】:

注意:我只是编辑您的代码请先根据您的代码确认并根据您的要求进行编辑

第 1 步:生成唯一文件名并将使用该文件名的图像保存到文件路径中。 第 2 步:成功写入文件后,将该路径保存到核心数据。 第 3 步:获取使用核心数据路径从目录中获取图像。

- (NSString*)generateFileNameWithExtension:(NSString *)extensionString 
        // Extenstion string is like @".png"

        NSDate *time = [NSDate date];
        NSDateFormatter* df = [NSDateFormatter new];
        [df setDateFormat:@"dd-MM-yyyy-hh-mm-ss"];
        NSString *timeString = [df stringFromDate:time];
        int r = arc4random() % 100;
        int d = arc4random() % 100;
        NSString *fileName = [NSString stringWithFormat:@"File-%@%d%d%@", timeString, r , d , extensionString ];

        NSLog(@"FILE NAME %@", fileName);

        return fileName; 




 - (void)imagePicker:(SNImagePickerNC *)imagePicker didFinishPickingWithMediaInfo:(NSMutableArray *)info
    

        _arrImages = [[NSMutableArray alloc]init];
        _imgdata = [[NSMutableData alloc]init];
        AppDelegate* app=(AppDelegate*)[[UIApplication sharedApplication]delegate];
        NSManagedObjectContext *context = app.managedObjectContext;

        Albums *objPhotos = (Albums *)[NSEntityDescription insertNewObjectForEntityForName:@"Albums" inManagedObjectContext:context];

    //get images
        for (int i = 0; i < info.count; i++) 
            ALAssetsLibrary *assetLibrary=[[ALAssetsLibrary alloc] init];
            [assetLibrary assetForURL:info[i] resultBlock:^(ALAsset *asset) 
            UIImage *image = [UIImage imageWithCGImage:[asset aspectRatioThumbnail]];
             _imageData = [NSData dataWithData:UIImagePNGRepresentation(image)];

    NSString *strfilename = [self generateFileNameWithExtension:@".jpg"];


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

            [_imageData writeToFile:filePath atomically:YES];

           [objPhotos setPhotosInAlbum:filePath];

         failureBlock:^(NSError *error)      ];
    
     NSError * err = nil;
    [context save:&err];


    if (![context save:&err]) 
        NSLog(@"Can't Save! %@ %@", err, [err localizedDescription]);
    
    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Success!!" message:@"Photos Successfully Selected!" delegate:self cancelButtonTitle:@"DONE" otherButtonTitles:nil];
    [alert show];

     

【讨论】:

现在,我是否可以像在代码中那样从核心数据中获取这些图像? @Mitul Bhadeshiya 在此图像中保存到目录,只是文件路径保存到您的核心数据。 只有文件路径保存到核心数据中? 我只是编辑 ans.. 请按照这些步骤... syntaxticallay 你必须管理它.. 我没有看懂你的第3步。由于我是新手,我对目录完全陌生,对核心数据也有一点了解。 @Mitul

以上是关于在 Core Data 中从库中保存和获取多个图像选择的主要内容,如果未能解决你的问题,请参考以下文章

如何在swift3中从库的PHAsset中获取图像文件名

如何在 Swift 中使用 URL 从库中获取图像? [复制]

如何获取从 iPhone 库中选择的多个图像的路径?

android - 从库中获取资源ID

拍照或从库中获取图像的权限未在 iOS 9 中显示(Xcode 7beta,Swift 2)

在swift中从本地获取图像