美文网首页
PHImageManager requestImageForAs

PHImageManager requestImageForAs

作者: 我叫没名字啊 | 来源:发表于2024-09-23 19:06 被阅读0次

Q:

iOS18 发布之后,收到了很多拉起相册时的崩溃客诉。堆栈日志如下:

#0 Thread
NSInternalInconsistencyException
opportunisticDegradedImagesToReturn cannot be zero.
解析原始
0
CoreFoundation
___exceptionPreprocess + 164

6
Photos
-[PHImageManager requestImageForAsset:targetSize:contentMode:options:resultHandler:] + 172

......(略)

crash 位置还是很清晰的,但是原因不清晰啊,没见过这个报错,网上也没搜到有效信息,也没听说 iOS18 后,相册哪里要做额外的兼容。

我们项目中的这块代码实现,简略如下:

PHImageRequestOptions *imageRequestOptions = [[PHImageRequestOptions alloc] initWithImageRequestOptions:options];
imageRequestOptions.synchronous = YES;
imageRequestOptions.networkAccessAllowed = YES;
imageRequestOptions.resizeMode = PHImageRequestOptionsResizeModeFast;
imageRequestOptions.deliveryMode = PHImageRequestOptionsDeliveryModeOpportunistic;

[[PHImageManager defaultManager] requestImageForAsset:phAsset targetSize:targetSize contentMode:PHImageContentModeAspectFit options:imageRequestOptions resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
   // TODO: image something
}];

A:

从报错信息看,主要是说 opportunisticDegradedImages 这个东西,不能是 zero,那 opportunistic 和 degraded 这两个关键词是什么意思呢?

opportunistic:

指的是 PHImageRequestOptions 对象 deliveryMode 属性的值,他表示请求的图像质量和交付优先级。我用的默认值 PHImageRequestOptionsDeliveryModeOpportunistic,表示平衡下图像质量和响应速度,也就是报错这个关键词。详情可参考这篇文章:链接

@property (nonatomic, assign) PHImageRequestOptionsDeliveryMode deliveryMode; // delivery mode. Defaults to PHImageRequestOptionsDeliveryModeOpportunistic

typedef NS_ENUM(NSInteger, PHImageRequestOptionsDeliveryMode) {
    PHImageRequestOptionsDeliveryModeOpportunistic = 0, // client may get several image results when the call is asynchronous or will get one result when the call is synchronous
    PHImageRequestOptionsDeliveryModeHighQualityFormat = 1, // client will get one result only and it will be as asked or better than asked
    PHImageRequestOptionsDeliveryModeFastFormat = 2 // client will get one result only and it may be degraded
};
degraded:

这单词是降级的意思,翻了翻 PHImageRequestOptions 的 API,allowSecondaryDegradedImage 属性看起来比较接近,他表示除了初始的降级结果之外,如果条件允许,是否还返回一个额外的降级结果。
这是 iOS17 新增的 API,官方也并没太多的说明介绍 AppleDevelopDoc链接

@property (nonatomic) BOOL allowSecondaryDegradedImage API_AVAILABLE(macos(14), ios(17), tvos(17)); // in addition to the initial degraded result, an additional degraded result will be returned if conditions permit
fix 方案:

于是尝试把 allowSecondaryDegradedImage 设为 YES 看看,然后就 OK 了。。。就不崩了。。。。

if (@available(iOS 17, *)) {
    imageRequestOptions.allowSecondaryDegradedImage = YES;
} else {
    // Fallback on earlier versions
}

至于底层原理是为什么,我也不清楚,只是根据报错信息,蒙着改了。如果有了解这块的朋友,欢迎大家留言讨论。

相关文章

  • PHImageManager

    如果看过了之前的三片文章,其实会发现自始至终,除了有几个和系统的交互会展示一张图片外,一张图片都没有看到,我们一直...

  • PHImageManager

    父类:NSObject 提供获取或生成预览缩略图和全尺寸图片,或者视频数据的方法。 一、概述 使用这些方法来获取全...

  • 获取高清图导致崩溃

    [[PHImageManager defaultManager] requestImageForAsset:ass...

  • iOS 获取视频第一帧的图片(内存占用较小)

    使用PHImageManager获取视频asset 后面两个子方法取自YBImageBrowser[https:/...

  • PHImageManager的使用

    版本:iOS13.7 一、简介 PHImageManager是一个专门请求图像与视频的类。每次请求完成后,会对已请...

  • iOS 13图片上传相关适配

    1.PHImageManager问题 常规使用情况下deliveryMode 使用PHImageRequestOp...

  • PHImageManager 获取图片模糊

    用以上的代码去获取图片会出现模糊,不清晰的状况。(明明options.deliveryMode = PHImage...

  • Photos框架详解 ---- PHImageManager

    摘自Mattt Thompson 的PHImage​Manager 1、tableView 中使用 PHImage...

  • PHAsset 获取文件大小

    目前的项目中需要获取PHAsset文件大小,经过测试发现,不用使用[PHImageManager defaultM...

  • Photos.framework

    ​通过PHAsset获取本地相册图片,主要通过PHImageManager获取.获取图片有两个接口,分别获取UII...

网友评论

      本文标题:PHImageManager requestImageForAs

      本文链接:https://www.haomeiwen.com/subject/rbhxrjtx.html