PHAssetResourceManager 用法?

PHAssetResourceManager usage?

我正在尝试使用 PHAssetResourceManager 从资产中获取数据。

我在任何地方都找不到关于此的任何示例。

我曾经使用 PHImageManager 但我的应用要到明年才会发布 所以我想到那个时候大多数人很可能已经采用了最新的 iOS 无论如何都是版本。

尝试记录指定资产的资源时 returns“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);

        }
     ];
});

我从模拟器中的视图控制器 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 对象。那是未定义的行为。