今天使用一个第三方,来实现一个自定义多图选择的效果,如下:
此为第三方实现效果效果看完了,然后来说一下其中的一个坑点:
即关于PHCachingImageManager此类的
PHCachingImageManager继承自PHImageManager
在PHImageManager中有一个生成单例的方法
+ (PHImageManager*)defaultManager;
当然,以上只是介绍,为没有接触过这两个类的能了解一下
To use a caching image manager:
Create aPHCachingImageManagerinstance. (This step replaces using the sharedPHImageManagerinstance.)
UsePHAssetclass methods to fetch the assets you’re interested in.
To prepare images for those assets, call thestartCachingImages(for:targetSize:contentMode:options:)method with the target size, content mode, and options you plan to use when later requesting images for each individual asset.
When you need an image for an individual asset, call therequestImage(for:targetSize:contentMode:options:resultHandler:)method, and pass the same parameters you used when preparing that asset.
If the image you request is among those already prepared, thePHCachingImageManagerobject immediately returns that image. Otherwise, Photos prepares the image on demand and caches it for later use.
以上为官方文档的说明
至此,废话说完,开始说问题:
因为项目中不全是使用这种多图选择的效果,有的地方选择单张图片,直接使用系统调取相册选取的方法,在此过程中会走:
[PHImageManager defaultManager];//系统调取相册并选择时默认实现
这样便会生成一个PHImageManager的单例对象;
因此,如果打开应用后,先使用了系统方法调取相册去选取图片,之后再使用
[PHCachingImageManager defaultManager];是无效的,这是一个显而易见的问题;
如果调用其方法,会crash,因为先走[PHImageManager defaultManager];得到的是PHImageManager的对象,而PHImageManager不能调用子类方法;
写第三方的作者是在此步骤前加上了一个强制类型转换,然而并无作用。
此处附上个人处理方法,仅供参考:
#import
@interfacePHCachingImageManager (shareManager)
+(instancetype)defaultManager;
@end
#import"PHCachingImageManager+shareManager.h"
@implementationPHCachingImageManager (shareManager)
+(instancetype)defaultManager{
static PHCachingImageManager *manager =nil;
static dispatch_once_tonceToken;
dispatch_once(&onceToken, ^{
manager = [[PHCachingImageManager alloc]init];
});
returnmanager;
}
@end
给PHCachingImageManager添加一个分类,即可,这样,在使用PHCachingImageManager的时候会单创建一个单例,避免与系统调取相册选取时重复;
这样在调用PHCachingImageManager的方法时才不会出现崩溃;
以上即为这次要说的坑点,很简单,但是网上没有找到对应说明,所以在此啰嗦一下,表达不当之处还望见谅。
网友评论