如何在iOS中的两个日期范围内从照片库中获取图像?

钱丹·雷迪(Chandan Reddy)

语境

我尝试从照片库中获取两个日期范围内的图像。

首先,我以字典的形式一张一张地获取照片库图像的信息,并使用键选择每个图像日期,并使用if条件将该日期与两个日期进行比较。

如果该图像的日期介于两个日期之间,则将该图像插入数组。

我要以阵列形式保存图像,因为我想在集合视图中显示它们。

问题

当它在模拟器上运行时,由于内存问题,它不能在实际设备上运行。

我认为真实设备照片库中有一堆图像,这就是为什么出现内存问题。

我怎么解决这个问题?

NSNoob

根据我们在您同意切换到Photos Framework而不是Assets Library的注释中的对话,与其将图像保存到阵列中,还不将PHAsset的本地标识符保存到阵列中。

获取位于您的日期范围内的图像的本地标识符

为了按日期获取图像,为了可重用性,首先创建一个实用程序方法来创建日期:

-(NSDate*) getDateForDay:(NSInteger) day andMonth:(NSInteger) month andYear:(NSInteger) year{
    NSDateComponents *comps = [[NSDateComponents alloc] init];
    [comps setDay:day];
    [comps setMonth:month];
    [comps setYear:year];
    NSDate *date = [[NSCalendar currentCalendar] dateFromComponents:comps];
    return date;
} 

您可以这样创建startDate和endDate:

NSDate *startDate = [self getDateForDay:11 andMonth:10 andYear:2015];
NSDate *endDate = [self getDateForDay:15 andMonth:8 andYear:2016];

现在,您需要从照片库中获取介于此范围之间的FetchResults。为此使用此方法:

-(PHFetchResult*) getAssetsFromLibraryWithStartDate:(NSDate *)startDate andEndDate:(NSDate*) endDate
{
    PHFetchOptions *fetchOptions = [[PHFetchOptions alloc] init];
    fetchOptions.predicate = [NSPredicate predicateWithFormat:@"creationDate > %@ AND creationDate < %@",startDate ,endDate];
    PHFetchResult *allPhotos = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:fetchOptions]; 
    return allPhotos;
}

现在,您将获得PHFetchResults该日期范围内存在的所有照片。现在,要提取本地标识符的数据数组,可以使用以下方法:

-(NSMutableArray *) getAssetIdentifiersForFetchResults:(PHFetchResult *) result{

    NSMutableArray *identifierArray = [[NSMutableArray alloc] init];
    for(PHAsset *asset in result){
        NSString *identifierString = asset.localIdentifier;
        [identifierArray addObject:identifierString];
    }
    return identifierArray;
}

添加方法以在需要时获取/利用单个资产

现在,您将需要PHAsset该图像。您可以像这样使用LocalIdentifier来获取PHAsset

-(void) getPHAssetWithIdentifier:(NSString *) localIdentifier andSuccessBlock:(void (^)(id asset))successBlock failure:(void (^)(NSError *))failureBlock{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        NSArray *identifiers = [[NSArray alloc] initWithObjects:localIdentifier, nil];
        PHFetchResult *savedAssets = [PHAsset fetchAssetsWithLocalIdentifiers:identifiers options:nil];
        if(savedAssets.count>0)
        {
            successBlock(savedAssets[0]);
        }
        else
        {
            NSError *error;
            failureBlock(error);
        }
    });
}

然后使用PHAsset,您可以获取所需大小的图像(尝试将其保持为最小,以最大程度地减少内存使用量):

-(void) getImageForAsset: (PHAsset *) asset andTargetSize: (CGSize) targetSize andSuccessBlock:(void (^)(UIImage * photoObj))successBlock {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        PHImageRequestOptions *requestOptions;

        requestOptions = [[PHImageRequestOptions alloc] init];
        requestOptions.resizeMode   = PHImageRequestOptionsResizeModeFast;
        requestOptions.deliveryMode = PHImageRequestOptionsDeliveryModeFastFormat;
        requestOptions.synchronous = true;
        PHImageManager *manager = [PHImageManager defaultManager];
        [manager requestImageForAsset:asset
                           targetSize:targetSize
                          contentMode:PHImageContentModeDefault
                              options:requestOptions
                        resultHandler:^void(UIImage *image, NSDictionary *info) {
                            @autoreleasepool {

                                if(image!=nil){
                                    successBlock(image);
                                }
                            }
                        }];
    });

}

但是,请勿直接调用这些方法来获取所需的所有图像。

而是在您的cellForItemAtIndexPath方法中调用这些方法,例如:

 //Show spinner
[self getPHAssetWithIdentifier:yourLocalIdentifierAtIndexPath andSuccessBlock:^(id assetObj) {
        PHAsset *asset = (PHAsset*)assetObj;
        [self getImageForAsset:asset andTargetSize:yourTargetCGSize andSuccessBlock:^(UIImage *photoObj) {
            dispatch_async(dispatch_get_main_queue(), ^{
                //Update UI of cell
                //Hide spinner
                cell.imgViewBg.image = photoObj;
            });
        }];
    } failure:^(NSError *err) {
       //Some error occurred in fetching the image
    }];

结论

因此,结论是:

  1. 您可以通过仅获取可见单元格的图像而不是全部获取图像来处理内存问题。
  2. 您可以通过在后台线程中获取图像来优化性能。

如果您想将所有资产汇总在一起,则可以使用fetchAssetCollectionWithLocalIdentifiers:方法来获取它,尽管我建议您反对使用它。

如果您有任何疑问或有任何其他反馈,请发表评论。


感谢Lyndsey Scott将PHFetchResult谓词设置为谓词,以便在此处的答案中获取两个日期之间的图像

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在不同客户端的不同范围内获取 SQL-oracle 中两个日期之间的所有月份

来自分类Dev

如何在 Google AppMaker 中获取两个日期之间的日期范围?

来自分类Dev

如何在两个日期范围内查找所有星期一

来自分类Dev

获取日期范围内两个日期之间的DAYS数据

来自分类Dev

如何在C#中获取日期范围内的所有周末

来自分类Dev

如何在python中获取日期范围内某些特定工作日的列表

来自分类Dev

MySQL查询以获取两个日期范围内的订单

来自分类Dev

在两个表的日期范围内加入/合并

来自分类Dev

Swift:如何设置两个日期之间的照片范围?

来自分类Dev

使用Google工作表中的查询功能,在两个单独的日期范围内求和的值的总和

来自分类Dev

在MYSQL中获取两个日期范围之间的记录

来自分类Dev

PHP,MySQL如何对两个不同日期范围内的数据求和

来自分类Dev

如何在两个数据框中计算日期范围内的均值

来自分类Dev

如何从照片库中获取图像?

来自分类Dev

如何在SQL Server中的两个表中循环日期范围

来自分类Dev

如何在MYSQL中的两个日期(从日期,到日期)表之间获取数据?

来自分类Dev

如何在一个范围内相加两个随机数?

来自分类Dev

如何获取数据框中两个重叠日期之间的范围?

来自分类Dev

在Google表格中,当日期在某个范围内而该范围在两个不同的列中时,对行进行计数

来自分类Dev

如何在字符串中搜索3个字母后的日期并确定其是否在日期范围内

来自分类Dev

当两个日期不同时,如何在javascript中获取两个日期之间的差异

来自分类Dev

给定一个范围,在Scala中获取该范围内的所有日期

来自分类Dev

如何在VBA中的两个日期范围之间进行搜索?

来自分类Dev

如何在VBA Excel中集体搜索范围内的两个值

来自分类Dev

如何在Codeigniter中减去两个日期(从数据库的2列中)

来自分类Dev

如何检查数据表中每一行的列值是否在另两个范围内

来自分类Dev

如何在C#中获取两个日期之间的日期

来自分类Dev

如何在oracle中获取特定月份的两个日期之间的日期列表

来自分类Dev

如何在python 2.7中减去两个日期并获取日期

Related 相关文章

  1. 1

    如何在不同客户端的不同范围内获取 SQL-oracle 中两个日期之间的所有月份

  2. 2

    如何在 Google AppMaker 中获取两个日期之间的日期范围?

  3. 3

    如何在两个日期范围内查找所有星期一

  4. 4

    获取日期范围内两个日期之间的DAYS数据

  5. 5

    如何在C#中获取日期范围内的所有周末

  6. 6

    如何在python中获取日期范围内某些特定工作日的列表

  7. 7

    MySQL查询以获取两个日期范围内的订单

  8. 8

    在两个表的日期范围内加入/合并

  9. 9

    Swift:如何设置两个日期之间的照片范围?

  10. 10

    使用Google工作表中的查询功能,在两个单独的日期范围内求和的值的总和

  11. 11

    在MYSQL中获取两个日期范围之间的记录

  12. 12

    PHP,MySQL如何对两个不同日期范围内的数据求和

  13. 13

    如何在两个数据框中计算日期范围内的均值

  14. 14

    如何从照片库中获取图像?

  15. 15

    如何在SQL Server中的两个表中循环日期范围

  16. 16

    如何在MYSQL中的两个日期(从日期,到日期)表之间获取数据?

  17. 17

    如何在一个范围内相加两个随机数?

  18. 18

    如何获取数据框中两个重叠日期之间的范围?

  19. 19

    在Google表格中,当日期在某个范围内而该范围在两个不同的列中时,对行进行计数

  20. 20

    如何在字符串中搜索3个字母后的日期并确定其是否在日期范围内

  21. 21

    当两个日期不同时,如何在javascript中获取两个日期之间的差异

  22. 22

    给定一个范围,在Scala中获取该范围内的所有日期

  23. 23

    如何在VBA中的两个日期范围之间进行搜索?

  24. 24

    如何在VBA Excel中集体搜索范围内的两个值

  25. 25

    如何在Codeigniter中减去两个日期(从数据库的2列中)

  26. 26

    如何检查数据表中每一行的列值是否在另两个范围内

  27. 27

    如何在C#中获取两个日期之间的日期

  28. 28

    如何在oracle中获取特定月份的两个日期之间的日期列表

  29. 29

    如何在python 2.7中减去两个日期并获取日期

热门标签

归档