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 对象。那是未定义的行为。
我正在尝试使用 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 对象。那是未定义的行为。