【问题标题】:iOS: TableView with multiple Images per Row (SDWebImage)iOS:每行有多个图像的 TableView (SDWebImage)
【发布时间】:2013-01-27 12:58:15
【问题描述】:

我对我的分段表格视图有点绝望。我使用自定义 UITableViewCell 与 4 图像如下:

我尝试通过 SDWebImage 为每个单元格加载图像。

加载过程都在我的自定义 UITableViewCell 中完成 - 而不是在 UITableViewController 中。从cellForRowAtIndexPath 我只需调用[cell setup] 在当前单元格中执行以下代码:

NSArray *imageViews = [NSArray arrayWithObjects:self.imageView1, self.imageView2, self.imageView3, self.imageView4, nil];

for (int i = 0; i < self.products.count; i++) {

    Product *currentProduct = [self.products objectAtIndex:i];
    UIImageView *currentImageView = [imageViews objectAtIndex:i];

    NSString *thumbURL = [[CommonCode getUnzippedDirectory] stringByAppendingPathComponent:currentProduct.collectionFolderName];
    thumbURL = [thumbURL stringByAppendingPathComponent:thumbFolder];
    thumbURL = [thumbURL stringByAppendingPathComponent:currentProduct.product_photo];

    [currentImageView setContentMode:UIViewContentModeScaleAspectFit];

    [currentImageView setImageWithURL:[NSURL fileURLWithPath:thumbURL]
                   placeholderImage:[UIImage imageNamed:@"placeholder.png"]];
}

图像全部存储在文档目录中,并且不大于最大值。 500KB。

问题:

我的问题是,当我滚动浏览我的表格视图时,它突然崩溃了,我不知道为什么。为所有异常启用符号断点表明它由于 SDWebImage 中的一行而崩溃。不幸的是,没有调试器输出:(它在分配图像的地方崩溃)

UIImage *image = nil;
if ([imageOrData isKindOfClass:[NSData class]])
{
    image = [[UIImage alloc] initWithData:(NSData *)imageOrData];
}

我还尝试通过dispatch_asnyc 加载图像,结果相似。 会不会和并发文件操作有关?

此外,当我快速滚动时,我会收到内存警告,因此我必须清除 SDWebImage 的缓存。同时停在上面提到的SDWebImage中的代码行。

我已经在网上搜索了 2 天,但没有找到有用的东西。我很高兴有一些提示可以解决这个问题。如果有人需要其他数据,例如崩溃报告或其他数据,请告诉我,我会尽快提供。

【问题讨论】:

  • 您在使用 ARC 吗?当应用程序崩溃时,消息是什么(EXC_BAD_ACCESS、sig fault 等)?你试过启用僵尸吗?
  • 是的,我正在使用 ARC。不幸的是,现在有消息。在应用程序崩溃之前,我的 TableViewController 中只收到了几个内存警告。此外,所有异常的符号断点表明 SDWebImage 中的这一行会造成麻烦(它说:线程 3:在断点 0 处停止)。当我使用异步队列而不是 SDWebImage 时也会发生同样的情况 - 当我想分配图像时会出现问题。
  • 我认为分配图像时它停止的原因是内存不足。但是 SDWebImage 不应该处理这个吗?
  • 我同意 Bins Ich 的观点,即应用程序占用了太多内存。即使图像文件大小为 500k(对于缩略图图像来说似乎很大),它在内存中的大小可能要大得多(内存中的大小 = 宽度 x 高度 x 字节/像素)。建议创建另一个版本的图像,并将其放在与图像视图相同大小的表格视图中作为测试。我怀疑你不会有同样的问题。
  • 作为一个集合视图,你正在尝试做的事情让我印象深刻。您确定要使用分段表格视图吗? Apple 现在通过集合视图为此提供内置功能,以有效地管理出队、滚动等。

标签: ios asynchronous uitableview sdwebimage


【解决方案1】:

我也遇到过同样的问题,但我暂时像下面这样解决了,但它导致内存问题,尤其是在 iPhone 4s 上

NSArray *arrImgs = cellModel.thumbnails_qqnews;
if (arrImgs.count > 0) {
    [self.imgView.subviews enumerateObjectsUsingBlock:^(__kindof UIImageView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        [obj sd_setImageWithURL:[NSURL URLWithString:arrImgs[idx]] placeholderImage:[UIImage imageNamed:@"placeholdImage"] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
            if (image != nil) {
                obj.image = [UIImage cutImageWithTargetSize:[NEMulTiNewsCell getImgSize] image:image];
            }
        }];
    }];
}

我认为多图下载是不合逻辑的,但我认为的方法是下载多张图片然后在一张图片中绘制多张图片然后显示,但它可能会创建大量代码行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多