有人可以举例说明如何使用NSCache缓存字符串吗?或者任何人都有一个很好的解释链接?我似乎无法找到任何..
我正在编写一个应用程序,需要保留一堆对象的内存缓存,但这不会失控,所以我打算使用NSCache来存储它.看起来它会照顾清除等对我而言,这太棒了.
我还想在启动之间保持缓存,所以我需要将缓存数据写入磁盘.有没有一种简单的方法可以将NSCache内容保存到plist或其他东西?是否有更好的方法可以使用NSCache之外的其他东西来实现这一目标?
这个应用程序将在iPhone上,所以我只需要iOS 4+中提供的类而不仅仅是OS X.
谢谢!
我正在开发一个类似于Instagram Feed的应用程序(包含图像和一些标签的单元格的表格视图).
对于我从数据库中获取的所有数据,我正在使用数据任务(因为接收它们并不需要太多),但是对于图像(我们使用数据请求获取它们的URL),我需要保存在本地以备将来使用(改善用户体验).
我的逻辑如下:保存在NSCache或文档目录中,文件夹中的图像带有下载日期(创建一次并附加所有其他图像,如果需要)(我正在删除不是来自最近的7个文件夹)几天,然后对于TableView,只是从那里加载,所以tableview将平滑滚动,不会直接从其委托方法加载网址.那么根据我的需求,NSCache或文档目录,哪里有更好的存储位置.
期待听到您的建议,谢谢!
我注意到当应用程序进入后台时,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) 我一直在寻找一种明确的方法来做到这一点,并没有找到任何可以给出一个例子并解释得很好的地方.我希望你能帮助我.
这是我正在使用的代码:
- (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) 我需要创建一个像NSCache这样的字典,这对于保持cahce来说是线程安全的.但是,偶尔,我需要刷新Cache的内容.NSCache不提供迭代其键的方法.这里会有什么替代方案?NSMutableDictionary与同步?
因此,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".
有任何想法吗?
这可能是预期的行为,但Apple没有明确说明.
我正在使用NSCache缓存一些图像给我UICollectionView.当我将应用程序放在后台并立即再次打开时,我的所有图像都不在了NSCache.
理想情况下,我希望最近加载的图像保持缓存状态,这样当用户重新打开应用程序时,他们不必再支付加载所有图像的费用.似乎NSCache应该允许不那么激进的缓存策略.
我只想在这里发帖进行一次健全检查,并确保我没有遗漏任何明显的东西.
否则,我将不得不实现自己的缓存,只将最后25个加载的图像保存在NSMutableDictionary缓存中.
nscache ×10
ios ×8
objective-c ×5
cocoa ×3
iphone ×3
asynchronous ×1
cocoa-touch ×1
nsurlsession ×1
uiimage ×1
xcode ×1