iPeter
iPeter

Reputation: 1360

Saving and fetching Multiple Image Selection From Library in Core Data

I am building a project where I am using ELCImagepickerController for multiple selection and then I am saving those selected image into core data. Now I am fetching those images in another VC and showing them into an UICollectionView.

But the problem I am facing here is the images are not properly showing in collectionView. I am having two confusions.

Here I am entering selected images into core data

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

} 

Here I am fetching those selected images

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

I am calling the fetching function in - (NSInteger) collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section and returning the array count

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

    return [[self getMenCategoryList] count];
}

And lastly, populating the images into collectionView here

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

Any help is highly appreciated.

Upvotes: 0

Views: 555

Answers (1)

Mitul Bhadeshiya
Mitul Bhadeshiya

Reputation: 1358

NOTE: i am just edit your code Please confirm first as per your code and edit as per your requirement

step 1: generate Unique file name and save your image with that file name to your file path.
step 2: after successfully write your file then save that path to your core data.
step 3: for fetching use core data path to get images from directory.

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

    } 

Upvotes: 1

Related Questions