2015-10-03 54 views
0

我試圖使用PHAssetResourceManager從資產中提取數據。PHAssetResourceManager的用法?

我找不到任何關於此的任何示例。

我用PHImageManager但我的應用程序將不會被釋放,直到明年 所以我想那個時候大多數人會最有可能,反正採用了最新的iOS 版本。

當試圖記錄指定資源的資源時,下面的代碼返回「0」。

我如何使用PHAssetResourceManager

我的代碼:

PHFetchOptions *fetchOptions; 
    fetchOptions.sortDescriptors = @[ [NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:YES], ]; 
    PHFetchResult *fetchResult = [PHAsset fetchAssetsWithOptions:fetchOptions]; 

    NSLog(@"fetchResult.count = %lu", fetchResult.count); 

    PHAsset *asset = [fetchResult objectAtIndex: assetIndex]; 

    NSArray *resourceArray = [PHAssetResource assetResourcesForAsset: asset]; 

    NSLog(@"resourceArray.count = %lu", resourceArray.count); //<<< returns 0? 

    PHAssetResource *ar = [resourceArray objectAtIndex: 0]; 
    PHAssetResourceRequestOptions *arro = [[PHAssetResourceRequestOptions alloc] init]; 


    PHAssetResourceManager *arm = [PHAssetResourceManager defaultManager]; 


    [arm requestDataForAssetResource:ar options:arro 
     dataReceivedHandler:^(NSData *assetData){ 
      NSLog(@"extractData dataReceivedHandler: %lu", assetData.length); 
     } 

     completionHandler:^(NSError *error){ 
      NSLog(@"extractData Error: %@", error); 

     } 
    ]; 
}); 

回答

1

我打電話從模擬器視圖控制器viewDidLoad方法下面的方法和一切正常。

- (void)readAsset:(NSInteger)assetIndex { 
    PHFetchOptions *fetchOptions = [[PHFetchOptions alloc] init]; 
    fetchOptions.sortDescriptors = @[ [NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:YES] ]; 
    PHFetchResult *fetchResult = [PHAsset fetchAssetsWithOptions:fetchOptions]; 

    if (assetIndex < fetchResult.count) { 
     PHAsset *asset = fetchResult[assetIndex]; 
     NSArray *resourceArray = [PHAssetResource assetResourcesForAsset: asset]; 
     PHAssetResource *assetResource = resourceArray[0]; 

     PHAssetResourceManager *arm = [PHAssetResourceManager defaultManager]; 
     [arm requestDataForAssetResource:assetResource options:nil dataReceivedHandler:^(NSData * _Nonnull data) { 
      NSLog(@"data.length = %lu", (unsigned long)data.length); 
     } completionHandler:^(NSError * _Nullable error) { 
      NSLog(@"error = %@", error); 
     }]; 
    } 
    else { 
     NSLog(@"no such asset."); 
    } 
} 

產量爲:

fetchResult.count = 5 
data.length = 1048576 
data.length = 1048576 
data.length = 507598 
data.length = 0 
error = (null) 

你能弄清楚什麼是你的代碼和我之間有什麼不同?我所看到的唯一一件事就是在使用它之前不要創建PHFetchOptions對象。這是未定義的行爲。

+0

你是對的,模擬器工作正常,但在物理設備上不起作用。在我的情況下,它是iPhone 5S – vaid

+0

即使您在代碼中解決了問題之後? –

+1

是的,可能是因爲我的設備上沒有安裝iOS 9.0+。數十萬年的人類進化史,我很笨,不能更新我的操作系統。 Brb,會更新真實。 – vaid