Tencent / QMUI_iOS

QMUI iOS——致力于提高项目 UI 开发效率的解决方案
http://qmuiteam.com/ios
Other
7.05k stars 1.37k forks source link

iOS16.1 QMUIImagePickerCollectionViewCell中请求图片逻辑不对导致图片显示不出来 #1462

Open lengain opened 1 year ago

lengain commented 1 year ago

Bug 表现 QMUIImagePickerViewController读取相册,点击状态栏,回到顶部或快速上下滑动,图片cell加载图片显示错误。

具体代码:

- (void)renderWithAsset:(QMUIAsset *)asset referenceSize:(CGSize)referenceSize {
    self.assetIdentifier = asset.identifier;

    // 异步请求资源对应的缩略图
    [asset requestThumbnailImageWithSize:referenceSize completion:^(UIImage *result, NSDictionary *info) {
        if ([self.assetIdentifier isEqualToString:asset.identifier]) {
            self.contentImageView.image = result;
        } else {
            self.contentImageView.image = nil;
        }
    }];
   //..........
}

截图 从最下面返回顶部后,图片cell开始逐个变为白色

开始调试,添加颜色后,代码变为:

- (void)renderWithAsset:(QMUIAsset *)asset referenceSize:(CGSize)referenceSize {
    self.assetIdentifier = asset.identifier;

    // 异步请求资源对应的缩略图
    [asset requestThumbnailImageWithSize:referenceSize completion:^(UIImage *result, NSDictionary *info) {
        if ([self.assetIdentifier isEqualToString:asset.identifier]) {
            self.contentImageView.image = result;
            self.contentImageView.backgroundColor = UIColor.greenColor;
        } else {
            self.contentImageView.image = nil;
            self.contentImageView.backgroundColor = UIColor.redColor;
        }
    }];
   //..........
}

截图

如何重现

  1. 进入QMUIImagePickerViewController
  2. 快速上下滑动,或者返回顶部。
  3. 目前我的手机相册大概有1000张图片

预期的表现 正常情况下,图片正常显示

我的临时处理

@interface QMUIImagePickerCollectionViewCell ()
@property (nonatomic, assign) PHImageRequestID imageRequestID;
@property(nonatomic, strong, readwrite) QMUIAsset *assert;
@end

@implementation QMUIImagePickerCollectionViewCell

- (void)renderWithAsset:(QMUIAsset *)asset referenceSize:(CGSize)referenceSize {
    self.assetIdentifier = asset.identifier;
    self.assert = asset;
    [self requestImage:asset referenceSize:referenceSize];
    //..........
}

- (void)requestImage:(QMUIAsset *)asset referenceSize:(CGSize)referenceSize {
    if (self.imageRequestID > 0) {
        [[[QMUIAssetsManager sharedInstance] phCachingImageManager] cancelImageRequest:self.imageRequestID];
    }
    // 异步请求资源对应的缩略图
    self.imageRequestID = [asset requestThumbnailImageWithSize:referenceSize completion:^(UIImage *result, NSDictionary *info) {
        if ([self.assetIdentifier isEqualToString:asset.identifier]) {
            self.contentImageView.image = result;
        } else {
            self.contentImageView.image = nil;
            [self requestImage:self.assert referenceSize:referenceSize];
        }
    }];
}

@end

其他信息