iOS之序列化PHAsset

本文介绍了在iOS开发中如何实现序列化和恢复PHAsset,以便在草稿箱场景下保持用户图片选择状态。通过获取图片的localIdentifier,然后利用PHAsset的类方法还原资产对象,实现图片选择器的选中状态持久化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

场景分析

情景:草稿箱
描述:从草稿箱再次进入编辑界面,继续选择图片时,保持上次图片的选择状态
问题提出:笔者的图片选择器是使用TZImagePickerController,如果弹出选择器时,要保持图片的选中状态,必须在弹出前传递上次已选中的Asset数组。那么如何保存Asset数组呢?

序列化PHAsset

通过序列化PHAsset的localIdentifier,最后通过PHAsset的类方法,即可获得PHAsset对象

+ (PHFetchResult<PHAsset *> *)fetchAssetsWithLocalIdentifiers:(NSArray<NSString *> *)identifiers options:(nullable PHFetchOptions *)options;

具体演示

一、获得图片ID

/// TZImagePicker的代理方法
- (void)imagePickerController:(TZImagePickerController *)picker didFinishPickingPhotos:(NSArray<UIImage *> *)photos sourceAssets:(NSArray *)assets isSelectOriginalPhoto:(BOOL)isSelectOriginalPhoto infos:(NSArray<NSDictionary *> *)infos
{
    _selectedAssets = [NSMutableArray arrayWithArray:assets];
    for(NSInteger i = 0; i < infos.count; i++)
    {
        // asset.localIdentifier 为图片唯一ID
        [self.selectedImagesId addObject:asset.localIdentifier];
    }
}

二、将图片ID –> PHAsset

- (void)setSelectedImagesId:(NSMutableArray *)selectedImagesId
{
    _selectedImagesId = selectedImagesId;
    for (NSString *ID in self.selectedImagesId)
    {
        PHFetchResult *fetchResult = [PHAsset fetchAssetsWithLocalIdentifiers:@[ID] options:nil];
        [_selectedAssets addObject:fetchResult.firstObject];
    }
}

三、传递selecteAsset

/// 显示图片选择控制器
- (void)showImagePickerCompletion:(void(^)())completion
{
    TZImagePickerController *picker = [[TZImagePickerController alloc] initWithMaxImagesCount:maxPhotoCount delegate:self];
    picker.allowPickingOriginalPhoto = NO;
    picker.selectedAssets = _selectedAssets;
    [self presentViewController:picker animated:YES completion:^{
        if(completion)
            completion();
    }];
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值