我试图计算在照片文件夹中的图像所占的总存储空间。我编写了如下代码。我可以成功地获取图像,但是这个代码有两个问题-
任何想法都会很有帮助。我需要单独计算视频和歌曲的存储空间。
-(void)getPhotoSize{
dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[_allPhotos enumerateObjectsUsingBlock:^(PHAsset *asset, NSUInteger idx, BOOL *stop) {
if (idx<_allPhotos.count&&asset) {
[[PHImageManager defaultManager] requestImageDataForAsset:asset options:nil resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) {
float imageSize = imageData.length;
imageSize = imageSize;
data.totalPictureSize+=imageSize;
_currentPhotoAsset=asset;
}];
}
}];
});
}发布于 2016-08-16 20:42:26
我不明白您是在分配代码,而不是仅仅运行它,所以我将从下面的示例中删除GCD部件。您还需要运行to来检查泄漏,并找出占用内存的是什么,但我的猜测是,通过直接访问ivar,您有一个隐式的保留周期。试试这个:
-(void)getPhotoSize{
for (PHAsset *asset in _allPhotos) {
typeof(self) __weak weakSelf = self; // weak reference to self to avoid retain cycle
[[PHImageManager defaultManager] requestImageDataForAsset:asset options:nil resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) {
typeof(self) __strong strongSelf = weakSelf; // strong reference to make sure self exists until the block finishes
float imageSize = imageData.length;
imageSize = imageSize;
strongSelf.data.totalPictureSize+=imageSize;
strongSelf.currentPhotoAsset=asset;
}];
}
}我还将其更改为正则for循环,以避免嵌套块。
快速和脏异步版本
-(void)photoSizeWithCompletion:(void (^)(float))completion {
NSArray *assets = _allPhotos;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
float totalSize = 0;
for (PHAsset *asset in assets) {
[[PHImageManager defaultManager] requestImageDataForAsset:asset options:nil resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) {
totalSize += imageData.length;
}];
}
completion(totalSize);
});
}就这样说吧:
[someObject photoSizeWithCompletion:^(float totalSize){
// use the totalSize
}]这不支持当用户点击后退按钮时取消。但是,我将把它作为家庭作业来查看NSOperationQueue,以实现可取消的异步操作。查看苹果在操作队列和并发性上的文档。
https://stackoverflow.com/questions/38983896
复制相似问题