更具體地說,您如何知道PHAsset
是否具有與原始版本不同的基礎資產的當前版本?如何知道PHAsset是否被修改?
我的用戶只需要在當前或原始資產之間進行選擇。然後我需要他們的回答PHImageRequestOptions.version
。
更具體地說,您如何知道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