如何知道PHAsset是否被修改?
更具体地说,您如何知道PHAsset
是否具有与原始版本不同的基础资产的当前版本?如何知道PHAsset是否被修改?
我的用户只需要在当前或原始资产之间进行选择。然后我需要他们的回答PHImageRequestOptions.version
。
我发现了两种检查PHAsset
的方法,我已经发布它作为Gist。
- (void)tb_checkForModificationsWithEditingInputMethodCompletion:(void (^)(BOOL))completion {
PHContentEditingInputRequestOptions *options = [PHContentEditingInputRequestOptions new];
options.canHandleAdjustmentData = ^BOOL(PHAdjustmentData *adjustmentData) { return YES; };
[self requestContentEditingInputWithOptions:options completionHandler:^(PHContentEditingInput *contentEditingInput, NSDictionary *info) {
if (completion) completion(contentEditingInput.adjustmentData != nil);
}];
}
- (void)tb_checkForModificationsWithAssetPathMethodCompletion:(void (^)(BOOL))completion {
PHVideoRequestOptions *options = [PHVideoRequestOptions new];
options.deliveryMode = PHVideoRequestOptionsDeliveryModeFastFormat;
[[PHImageManager defaultManager] requestAVAssetForVideo:self options:options resultHandler:^(AVAsset *asset, AVAudioMix *audioMix, NSDictionary *info) {
if (completion) completion([[asset description] containsString:@"/Mutations/"]);
}];
}
编辑︰我是在我需要与图像PHAsset相同的功能的点。我用这个:
- (void)tb_checkForModificationsWithAssetPathMethodCompletion:(void (^)(BOOL))completion {
[self requestContentEditingInputWithOptions:nil completionHandler:^(PHContentEditingInput *contentEditingInput, NSDictionary *info) {
NSString *path = (contentEditingInput.avAsset) ? [contentEditingInput.avAsset description] : contentEditingInput.fullSizeImageURL.path;
completion([path containsString:@"/Mutations/"]);
}];
}
看看PHImageRequestOptionsVersion
PHImageRequestOptionsVersionCurrent
索取最新版本的图像资产(反映所有编辑的)的。 生成的图像是以前进行的所有调整的渲染输出。
PHImageRequestOptionsVersionUnadjusted
申请一个版本的图片资源的,无需调整。
如果资产已被编辑,则生成的图像会在执行任何编辑之前反映资产的状态。
PHImageRequestOptionsVersionOriginal
请求图像资产的原始,最高保真度的版本。不管是否进行了任何编辑,最终生成的图像都是原始捕获或导入版本的 资产。
如果您在检索资产之前询问用户,您知道用户指定了哪个版本。如果您从其他地方获得阶段,则可以使用revertAssetContentToOriginal获取原始资产。 PHAsset具有modificationDate和creationDate属性,您可以使用它来判断PHAsset是否被修改。
我发现这个代码是现在唯一的工作,它处理大多数的边缘情况。它可能不是最快的,但对大多数图像类型都适用。它采用尽可能最小的原始和修改图像并比较其数据内容。
@implementation PHAsset (Utilities)
- (void)checkEditingHistoryCompletion:(void (^)(BOOL edited))completion
{
PHImageManager *manager = [PHImageManager defaultManager];
CGSize compareSize = CGSizeMake(64, 48);
PHImageRequestOptions *requestOptions = [PHImageRequestOptions new];
requestOptions.synchronous = YES;
requestOptions.deliveryMode = PHImageRequestOptionsDeliveryModeFastFormat;
requestOptions.version = PHImageRequestOptionsVersionOriginal;
[manager requestImageForAsset:self
targetSize:compareSize
contentMode:PHImageContentModeAspectFit
options:requestOptions
resultHandler:^(UIImage *originalResult, NSDictionary *info) {
UIImage *currentImage = originalResult;
requestOptions.version = PHImageRequestOptionsVersionCurrent;
[manager requestImageForAsset:self
targetSize:currentImage.size
contentMode:PHImageContentModeAspectFit
options:requestOptions
resultHandler:^(UIImage *currentResult, NSDictionary *info) {
NSData *currData = UIImageJPEGRepresentation(currentResult, 0.1);
NSData *orgData = UIImageJPEGRepresentation(currentImage, 0.1);
if (completion) {
//handle case when both images cannot be retrived it also mean no edition
if ((currData == nil) && (orgData == nil)) {
completion(NO);
return;
}
completion(([currData isEqualToData:orgData] == NO));
}
}];
}];
}
@end
您的解决方案仅适用于图像。来自已接受答案的第二个代码块(EDIT之后的代码块)不适用于您? – 2015-02-04 12:59:02
不幸的是:/即使在修改后,我仍然收到常规路径,例如:路径\t NSString * \t @“/ var/mobile/Media/DCIM/100APPLE/IMG_0736.PNG”\t 0x15d683d0 – 2015-02-04 14:18:25
我已经更新了这个问题,我需要这些信息才能正确创建* PHImageRequestOptions *。 – 2014-10-30 13:13:14
[文档](https://developer.apple.com/library/IOs/documentation/Photos/Reference/PHAsset_Class/index.html#//apple_ref/occ/instp/PHAsset/modificationDate):'照片更新修改日期当资产的图像或视频内容或元数据发生变化时。“所以当您最喜欢的图片时,修改日期也会发生变化。 – 2014-10-30 13:17:38
你对此做过测试吗? – gabbler 2014-10-30 13:19:23