gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 18:07:18 26 4
gpt4 key购买 nike

语境
我正在尝试从照片库中获取两个日期范围内的图像。
首先,我在字典形式中一张一张地获取照片库图像的信息,并使用键选择每个图像日期,并使用 if 条件将该日期与两个日期进行比较。
如果该图像的日期介于两个日期之间,则将该图像插入数组。
我将图像保存在数组中,因为我想在 Collection View 中显示它们。
问题
虽然它在模拟器上工作,但由于内存问题,它不能在真实设备上工作。
我认为真实设备照片库中有很多图像,这就是为什么会出现内存问题。
我怎么解决这个问题?

最佳答案

根据我们在评论中的对话,您同意切换到照片框架而不是 Assets 库,而不是将图像保存到您的数组中,而是将 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;
}

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

现在,您将需要 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
}];

结论

所以总而言之:
  • 您可以通过仅获取可见单元格的图像而不是获取全部图像来处理您的内存问题。
  • 您可以通过在后台线程上获取图像来优化性能。

  • 如果你想把你所有的 Assets 放在一起,你可以使用 fetchAssetCollectionWithLocalIdentifiers:方法虽然我会推荐反对它。

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

    感谢 Lyndsey Scott 将谓词设置为 PHFetchResult 请求以在她的答案中获取两个日期之间的图像 here

    关于ios - 如何从 iOS 中两个日期范围内的照片库中获取图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39587405/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com