保存和检索图像到集合视图

时间:2016-10-04 09:25:47

标签: objective-c uicollectionview nsdocumentdirectory

我将图像存储在nsdocument目录路径和单例类中的字典中,我想从字典或文档目录中检索这些图像并将它们加载到集合视图中。 我试过,我得到的是相同的图像是复制.. 这是我的代码..

 -(IBAction)takephoto:(id)sender
   {
   tapCount += 1;
   AVCaptureConnection *videoConnection  = nil;
   for(AVCaptureConnection *connection in StillImageOutput.connections)
   {
    for(AVCaptureInputPort *port in  [connection inputPorts])
    {
        if ([[port mediaType] isEqual:AVMediaTypeVideo]){
            videoConnection =connection;
            break;

        }
    }
}


[StillImageOutput captureStillImageAsynchronouslyFromConnection:videoConnection completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error){


    if (imageDataSampleBuffer!=NULL) {

        NSData *imageData =[AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageDataSampleBuffer];


        self.image = [ UIImage imageWithData:imageData];
        int x = arc4random() % 100;
        NSTimeInterval secondsSinceUnixEpoch = [[NSDate date]timeIntervalSince1970];

        self.UniqueImageName = [NSString stringWithFormat:@"%@_%d_%d",self.siteName,x,(int)secondsSinceUnixEpoch];

       [[SingletonImage singletonImage]SaveImageInNSdocumentAndCache:self.image withImageName:self.UniqueImageName];
         //reloading the collection view
        [self.collection_View reloadData];

我的单身课

      #import "SingletonImage.h"

     @implementation SingletonImage



      - (id)init
         {
self = [super init];
if ( self )
{
    self.arrayDict = [[NSMutableArray alloc] init];
   self.imageDict = [[NSMutableDictionary alloc]init];
      }
return self;
  }

  +(instancetype)singletonImage
   {
static SingletonImage *singletonImage;

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{
    singletonImage = [[SingletonImage alloc]init];


});
return singletonImage;}

//将图像保存到字典数组和nsdocument目录路径

 -(void)SaveImageInNSdocumentAndCache:(UIImage *)image  withImageName:(NSString *)str
  {

//Saving image in array of dictionaries

[self.imageDict setObject:image forKey:str];

[self.arrayDict insertObject:self.imageDict atIndex:0];


 //Saving image in nsdocumnet directory path
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentDirectory = paths.firstObject;
NSData *imageData = UIImagePNGRepresentation(image);

NSString *imageFolder = @"Photos";

NSDateFormatter *dateFormat = [[NSDateFormatter alloc]init];

[dateFormat setDateFormat:@"yyyMMddHHmmss"];
   NSString *imagePath = [NSString stringWithFormat:@"%@/%@",documentDirectory,imageFolder];

BOOL isDir;
NSFileManager *fileManager= [NSFileManager defaultManager];
if(![fileManager fileExistsAtPath:imagePath isDirectory:&isDir])
    if(![fileManager createDirectoryAtPath:imagePath withIntermediateDirectories:YES attributes:nil error:NULL])
        NSLog(@"Error: folder creation failed %@", documentDirectory);

[[NSFileManager defaultManager] createFileAtPath:[NSString stringWithFormat:@"%@/%@", imagePath, str] contents:nil attributes:nil];
[imageData writeToFile:[NSString stringWithFormat:@"%@/%@", imagePath, str] atomically:YES];

}

//提供图像,如果它在字典中

       - (UIImage *)ProvideImage:(NSString *)text {

UIImage *Savedimage;

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

if ([self.imageDict objectForKey:text]) {

    Savedimage = [self.imageDict objectForKey:text];
    }

    else if ([[NSFileManager defaultManager]fileExistsAtPath:filePath])
{

    Savedimage = [UIImage imageWithContentsOfFile:filePath];

    NSLog(@"%@",Savedimage);

        //Savedimage =
        NSLog(@"File exists at the path");

    }

    else

    {
        NSLog(@"Image doesnot exist");

    }
    return Savedimage;}

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

   CollectionViewCell *Cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath];


//Loading images




UIImage *savedImage = [[SingletonImage singletonImage]ProvideImage:self.UniqueImageName];

Cell.image_View.image =savedImage;

return cell;}

我多次获得相同的图像。请帮助我做这个..

提前致谢!!!

1 个答案:

答案 0 :(得分:0)

你应该真的使用SDImageCache - 这很容易

#import <SDWebImage/UIImageView+WebCache.h>

将图像存储在内置缓存字典中:

[[SDImageCache sharedImageCache] storeImage:image forKey:@"image1"];

在任何时候检索图像:

SDImageCache *imageCache = [SDImageCache sharedImageCache];
NSString *key = @"image1"
[imageCache queryDiskCacheForKey:key done:^(UIImage *image , SDImageCacheType cacheType) {
     if (image)
     {
         view.image = image;
     }
     else
     {
         view.image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:key]]];
     }
}];

这意味着您可以尽早存储图像 - 尤其是当您从互联网上下载图像时。