Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何缓存作为自定义UITableViewCell一部分的CollectionViewCell图像_Ios_Objective C_Uitableview_Uicollectionview - Fatal编程技术网

Ios 如何缓存作为自定义UITableViewCell一部分的CollectionViewCell图像

Ios 如何缓存作为自定义UITableViewCell一部分的CollectionViewCell图像,ios,objective-c,uitableview,uicollectionview,Ios,Objective C,Uitableview,Uicollectionview,所以,我有一个新闻提要结构。每个新闻块都是一个自定义的UITableViewCell。现在,每个自定义单元格都有一个显示图像的CollectionView 问题是,当滚动时,新闻单元格(新闻块)出现时,CollectionView会重新加载-每次单元格出现时。我试图找到在主ViewController侧缓存这些图像的方法 最好的方法是什么 您必须缓存UIImage实例,因此,如果您从任何来源获得一些图片,您可能会编写如下内容: /* some code before */ UIImage *y

所以,我有一个新闻提要结构。每个新闻块都是一个自定义的
UITableViewCell
。现在,每个自定义单元格都有一个显示图像的
CollectionView

问题是,当滚动时,新闻单元格(新闻块)出现时,
CollectionView
会重新加载-每次单元格出现时。我试图找到在主
ViewController
侧缓存这些图像的方法


最好的方法是什么

您必须缓存UIImage实例,因此,如果您从任何来源获得一些图片,您可能会编写如下内容:

/* some code before */
UIImage *yourImage = /* Get your UIImage from any available way */
[self.cache setObject:yourImage forKey:@"SomeUniqueID"];
/* some code after */
我想,这段代码作为一个函数看起来会更好,它获取UIImage实例及其id作为参数

在我看来,这是存储图像最常用的方法。如果您需要一种更为熟练的方法,而不需要第三方框架的任何开销,您可以阅读有关的文档

但一般来说,您有很多不同的方式来存储图像:

  • 从磁盘获取映像
  • 从内存中获取图像
  • 使用上面的一个变体,但除了它们之外,仍然使用一些轻量级和灵活的框架,您可以在GitHub上找到很多

  • 因此,我上面写的代码只会将图像存储到内存缓存中

    如果您不想为这种工作实现自己的缓存/磁盘/内存处理程序,我强烈建议您使用AFNetworking或SDWebImage来处理所有这些

    关于如何设置图像及其缓存的SDWebImage示例:

    [imageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"]
                 placeholderImage:[UIImage imageNamed:@"placeholder.png"]];
    
    这将自动为您处理所有缓存/磁盘/内存

    以下是使用SDWebImage处理缓存的示例:

    //设置内存大小限制(请检查旧设备,以避免将其设置为高值时出现内存错误。)

    //清除磁盘缓存

    [[SDImageCache sharedImageCache] clearDiskOnCompletion:^{
    }];
    
    //清除内存缓存

    [[SDImageCache sharedImageCache] clearMemory];
    

    我会远离NSUserDefaults或上述示例,将图像设置为字典或数组以避免内存错误和应用程序崩溃/性能。

    谢谢您的回答。我明白了。纳闷,NSCache内存是否可以跨UIViewController工作(类似于NSUserDefault..)@ekashkin NSCache语法类似于NSUserDefaults,所有应该存储在缓存中的对象都必须实现NSSecureCoding协议,如UIImage
    [[SDImageCache sharedImageCache] clearMemory];