标签: nscache

如何使用NSCache

有人可以举例说明如何使用NSCache缓存字符串吗?或者任何人都有一个很好的解释链接?我似乎无法找到任何..

xcode cocoa objective-c ios nscache

120
推荐指数
4
解决办法
6万
查看次数

将NSCache内容保存到磁盘

我正在编写一个应用程序,需要保留一堆对象的内存缓存,但这不会失控,所以我打算使用NSCache来存储它.看起来它会照顾清除等对我而言,这太棒了.

我还想在启动之间保持缓存,所以我需要将缓存数据写入磁盘.有没有一种简单的方法可以将NSCache内容保存到plist或其他东西?是否有更好的方法可以使用NSCache之外的其他东西来实现这一目标?

这个应用程序将在iPhone上,所以我只需要iOS 4+中提供的类而不仅仅是OS X.

谢谢!

iphone cocoa cocoa-touch nscache

15
推荐指数
3
解决办法
1万
查看次数

iOS - 本地保存图像的最佳实践 - NSCache vs保存在文档目录中

我正在开发一个类似于Instagram Feed的应用程序(包含图像和一些标签的单元格的表格视图).

对于我从数据库中获取的所有数据,我正在使用数据任务(因为接收它们并不需要太多),但是对于图像(我们使用数据请求获取它们的URL),我需要保存在本地以备将来使用(改善用户体验).

我的逻辑如下:保存在NSCache或文档目录中,文件夹中的图像带有下载日期(创建一次并附加所有其他图像,如果需要)(我正在删除不是来自最近的7个文件夹)几天,然后对于TableView,只是从那里加载,所以tableview将平滑滚动,不会直接从其委托方法加载网址.那么根据我的需求,NSCache或文档目录,哪里有更好的存储位置.

期待听到您的建议,谢谢!

uiimage ios nscache nsurlsession

15
推荐指数
1
解决办法
9396
查看次数

NSCache和背景

我注意到当应用程序进入后台时,NSCache会清除其所有对象.这是预期的行为吗?有没有办法避免它?

当应用程序进入后台时,我预计当设备内存不足时,它会驱逐对象.

你知道有效的替代方案吗?

ios nscache

14
推荐指数
2
解决办法
4718
查看次数

NSCache不会驱逐数据

NSCache是一种很少使用的工具,实际上看起来非常有用.我创建了一个简单的实验,看看它是如何工作的,看起来它在低内存情况下不会自动驱逐数据(或者我做错了!)

- (void)viewDidLoad
{
    _testCache = [[NSCache alloc] init];

    // Allocate 600 MB of zeros and save to NSCache
    NSMutableData* largeData = [[NSMutableData alloc] init];
    [largeData setLength:1024 * 1024 * 600]; 
    [_testCache setObject:largeData forKey:@"original_Data"];
}

- (IBAction)buttonWasTapped:(id)sender {

    // Allocate & save to cache 300 MB each time the button is pressed
    NSMutableData* largeData = [[NSMutableData alloc] init];
    [largeData setLength:1024 * 1024 * 300]; 
    static int count = 2;
    NSString* key = [NSString stringWithFormat:@"test_data_%d", count++];
    [_testCache setObject:largeData forKey:key];

    NSMutableData* …
Run Code Online (Sandbox Code Playgroud)

iphone objective-c ios nscache

11
推荐指数
2
解决办法
8024
查看次数

在可重用的表格单元格中使用带有dispatch_async的NSCache的正确方法是什么?

我一直在寻找一种明确的方法来做到这一点,并没有找到任何可以给出一个例子并解释得很好的地方.我希望你能帮助我.

这是我正在使用的代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

static NSString *CellIdentifier = @"NewsCell";
NewsCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

// Configure the cell...

NewsItem *item = [newsItemsArray objectAtIndex:indexPath.row];

cell.newsTitle.text = item.title;

NSCache *cache = [_cachedImages objectAtIndex:indexPath.row];

[cache setName:@"image"];
[cache setCountLimit:50];

UIImage *currentImage = [cache objectForKey:@"image"];

if (currentImage) {
    NSLog(@"Cached Image Found");
    cell.imageView.image = currentImage;
}else {
    NSLog(@"No Cached Image");

    cell.newsImage.image = nil;

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, (unsigned long)NULL), ^(void)
                   {
                       NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:item.image]];
                       dispatch_async(dispatch_get_main_queue(), ^(void)
                       {
                           cell.newsImage.image = [UIImage imageWithData:imageData]; …
Run Code Online (Sandbox Code Playgroud)

iphone asynchronous ios nscache

11
推荐指数
2
解决办法
9117
查看次数

如何迭代NSCache密钥

我需要创建一个像NSCache这样的字典,这对于保持cahce来说是线程安全的.但是,偶尔,我需要刷新Cache的内容.NSCache不提供迭代其键的方法.这里会有什么替代方案?NSMutableDictionary与同步?

objective-c nscache

9
推荐指数
1
解决办法
3982
查看次数

Objective-c - 在静态NSMutableDictionary上使用NSCache的好处?

因此,NSCache对象应保持活动状态以保持缓存数据,这意味着必须使用用于存储数据的相同对象来检索数据.

  • 所以问题是使用NSCache而不是单个NSDictionary来保存我的数据是什么意思?
  • 使用NSCache的首选方法是什么?静电场?继承它并创建一个单身人士?

objective-c ios nscache

8
推荐指数
1
解决办法
3744
查看次数

NSCache:尝试访问缓存项时始终获得"不符合键值编码"

我正在尝试使用NSCache将PNG存储为NSData.每当我尝试从缓存中取出一个缓存,无论缓存是否为空,我得到:

2012-10-26 09:49:28.860 SledMap [55917:11503] *由于未捕获的异常'NSUnknownKeyException'终止应用程序,原因:'[valueForUndefinedKey:]:此类不是密钥值0_0_5的编码兼容.

如果我完全保留代码,但将NSCache更改为NSMutableDictionary,它可以正常工作.

我宣布我的缓存:

@property (nonatomic, strong) NSCache *tileCache;
Run Code Online (Sandbox Code Playgroud)

分配它(在viewDidLoad中):

self.tileCache = [[NSCache alloc] init];
self.tileCache.delegate = self;
Run Code Online (Sandbox Code Playgroud)

添加内容到缓存:

NSString *key = [NSString stringWithFormat:@"%i_%i_%i",x,y,endLevel];
NSData *pngData = [NSData dataWithData:UIImagePNGRepresentation(image)];
[self.tileCache setObject:pngData forKey:key];
Run Code Online (Sandbox Code Playgroud)

然后当我把它拿回来时,我得到了上述错误.

NSString *key = [NSString stringWithFormat:@"%i_%i_%i",x,y,endLevel];
NSData *tile = [self.tileCache valueForKey:key];  //This is the line it crashes on
Run Code Online (Sandbox Code Playgroud)

如果它是空的,我希望它只返回nil,这就是当我将self.tileCache设为NSMutableDictionary而不是NSCache时会发生的事情.此外,在调试区域,它说:

tile = NSData * 0x0134dc59 <Variable is not NSData>
Run Code Online (Sandbox Code Playgroud)

如果我传入NSString,它会做同样的事情,并且变量不是NSString.

另外,我可以硬编码key为"A",并尝试以相同的结果再次访问为"A".

有任何想法吗?

cocoa objective-c ios nscache

8
推荐指数
1
解决办法
1802
查看次数

当应用程序进入后台时,NSCache总是驱逐图像数据

这可能是预期的行为,但Apple没有明确说明.

我正在使用NSCache缓存一些图像给我UICollectionView.当我将应用程序放在后台并立即再次打开时,我的所有图像都不在了NSCache.

理想情况下,我希望最近加载的图像保持缓存状态,这样当用户重新打开应用程序时,他们不必再支付加载所有图像的费用.似乎NSCache应该允许不那么激进的缓存策略.

我只想在这里发帖进行一次健全检查,并确保我没有遗漏任何明显的东西.

否则,我将不得不实现自己的缓存,只将最后25个加载的图像保存在NSMutableDictionary缓存中.

ios nscache

8
推荐指数
2
解决办法
3365
查看次数