PhotoKit中遇到的问题

PhotoKit是iOS8出的一个新的照片库,用以取代AssetsLibrary

保存图片到相册

  • 方式1:只能保存UIImage
 // Add it to the photo library.
        PHPhotoLibrary.shared().performChanges({
            PHAssetChangeRequest.creationRequestForAsset(from: image)
        }, completionHandler: {success, error in
            if !success { print(error ?? "") }
        })

问题:保存图片到某个相册中,按照苹果推荐的做法结果却始终保存失败

[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
        PHAssetChangeRequest *createAssetRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:image];
        PHObjectPlaceholder *assetPlaceholder = createAssetRequest.placeholderForCreatedAsset;
        PHAssetCollectionChangeRequest *albumChangeRequest =
        [PHAssetCollectionChangeRequest changeRequestForAssetCollection:self.cameraRollAlbum];
        [albumChangeRequest addAssets:@[assetPlaceholder]];
    } completionHandler:^(BOOL success, NSError * _Nullable error) {
        if (success) {
            NSLog(@"保存成功");
        }else {
            NSLog(@"error:%@",error);
        }
    }];

,不知为何,self.cameraRollAlbum表示相机胶卷这个相册,之后查看了苹果官方的demo,豁然开朗,原来这个相册是不能添加asset(图片或者视频)的.
用户创建的自定义相册是可以添加的,苹果创建的系统相册(相机胶卷、最近添加...)是不可以添加的,可以通过PHCollection的下面这个方法判断:

assetCollection.canPerform(.addContent)
  • 方式2:iOS9新出的方法,保存图片的data数据
 [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
           [[PHAssetCreationRequest creationRequestForAsset] addResourceWithType:PHAssetResourceTypePhoto data:imageData options:nil];
        } completionHandler:^(BOOL success, NSError * _Nullable error) {
            dispatch_sync(dispatch_get_main_queue(), ^{
                 NSLog(@"%d,%@",success,error);
            });
        }];

补充:如果需要保存图片的NSData数据,通过方式2可以做到,但是这个方法只有iOS9后才有,如果需要支持iOS8,需要利用旧版的AssetsLibrary去处理

监听相册的变化

通过实现下面这个代理去监听,注意:这个代理并不是在主队列中执行的,而是一个内部的串行队列中执行,如果要更新UI,要派发到主队列中

@protocol PHPhotoLibraryChangeObserver <NSObject>
// This callback is invoked on an arbitrary serial queue. If you need this to be handled on a specific queue, you should redispatch appropriately
- (void)photoLibraryDidChange:(PHChange *)changeInstance;
@end

发现个奇怪的问题,保存图片的时候发现这个代理方法会调用多次,这并不是bug,可能苹果出于某种原因导致的,所以千万不要暴力的在这个代理回调里重新reload所有数据源,这么做会比较耗费CPU和内存,而应该通过代理的参数changeInstance去做判断更新指定的相册的变化

照片框架
Photos 框架实践以及坑

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明AI阅读 16,035评论 3 119
  • 短暂的春节假期一过,福叔和大家伙一样又开始了新的一年的奋斗! 预祝大家在新的一年家庭美满,事业顺利,吃嘛嘛香,身体...
    XSKY融合存储阅读 3,567评论 0 0
  • 本文来自 Crocutax 的博客 , 转载请注明出处 http://www.crocutax.com Andro...
    Crocutax阅读 4,490评论 0 1
  • 这是一首无章法的狂想曲,杂乱而真切,至少我这么想。 静说,16年不可思议的事情,喜欢上某人;讨厌的事情,亦喜欢上某...
    doudou99阅读 2,695评论 0 0
  • 在2017第五届新少年作文大赛中,高二学生申屠佳颖的一篇作文《孟婆湯》打动了作家余华、毕飞宇、叶兆言等诸多...
    红枫_叶子红了阅读 1,072评论 1 0