2013-06-25 29 views
0

我想了解NSCache的概念,有一件事让我想起了一个NSCache实例并不保证将值返回给您之前存储的密钥。如果它试图添加键值对,它可能甚至不存储键值对,如果它认为此时性能更重要。如何将NSCache与多个信息一起用作“密钥”?

那意味着什么,对我来说,就是:

  1. 每个键必须“保持”足够的信息来产生的值,如果必要
  2. 每个查询的NSCache,基本上只是形式因此应该包括生成相应值所需的所有信息。
  3. 从以上两点可以看出,NSCache并没有为在键和值之间建立任何类型的关联服务的目的 - 用户必须能够独立于缓存生成值,并且唯一目的是使用NSCache不是'查找'某种价值,而只是为了提高性能而交易内存

所以我的问题是关于存储图像的透明度蒙版。起初,我认为我只需要使用图像的名称作为键,但是从上面的推论看来,这似乎还不够 - 我还必须包括用于生成掩码的所有其他参数,例如例如,透明度阈值。这也意味着每次我向缓存提供掩码时,我都必须提供所有参数。我能想到的唯一方法就是使用NSInvocation这样的关键字;但这似乎是一个相当笨拙的解决方案。

+0

“使用NSCache的唯一目的不是'查找'某种价值,而只是为了提高性能而交换内存。”这就是缓存所做的。 – JAB

+0

基本上,如果你想要的只是键值关联,只需使用'NSMutableDictionary'和图像名称作为键。 http://stackoverflow.com/a/5756162/138772 – JAB

回答

0

经过对此的更多思考后,我想我有一件事是错误的 - NSCache中的密钥不一定需要保存所有用于生成值的信息。 NSCache中的一个键可以达到与NSDictionary中相同的目的 - 一个用于查找值的唯一标识符。唯一的区别是,如果之前添加的键值对被销毁,您总是需要为NSCache制定备份计划B.

在simplier而言,在两种不同类型的操作是这样的:

的NSDictionary

  1. 生成每个关键K每个值V和对添加到字典
  2. 外观up V使用K

NSCache

  1. 查找V使用K
  2. 如果V == nil,产生的价值V和对添加到缓存

因此,可能任何的NSDictionary几乎转换为NSCache ,只有在转换后你不能传递NSCache - 你必须知道如何在任何时候生成这些值,因此NSCache实例很可能是私有的财产只用于某一类别。

我的问题我已经解决使用这样的方法(self据说是指向NSCache的一个子类,但我还没有测试它尚未)

- (Mask *) maskForImageName:(NSString *)name maskGenerator:(Mask *(^)(NSString *))generator { 
    Mask *mask = [self objectForKey:name]; 
    if (!mask) { 
     mask = generator(name); 
     [self setObject:mask forKey:name]; 
    } 
    return mask; 
} 

这将是,如果进一步简化objective-c是一种功能性的懒惰式语言,在这种情况下,我甚至不需要将生成器封装在一个块中;但我现在对这个解决方案很满意。事实上,我觉得这种模式几乎总是与NSCache一起使用,所以我只是将它作为NSCache的一个类别添加。

2

缓存的本质是易失性的,所以缓存只能用于加速访问信息,这些信息也可以通过其他方式获取。

你的想法是创建保存所有这些信息的密钥应该可行 - 只要记住将所有密钥存储在缓存以外的其他位置。

至于为重点,您可以创建具有只是几个属性(即组成一个密钥的人),一个isEqual:hash方法,也许这需要参数的每一个的初始化一个非常简单的类的属性。

这需要极少的代码,因为属性的访问器和iVar是自动生成的,所以您真正需要编写的唯一东西是isEqual:方法(和hash)。

这个类是如此之小而且为你需要的特定情况而制造的,在你要使用它的.m文件的顶部声明和实现它是有意义的。这样,你不会污染系统的其他部分。只需在您的.m文件顶部添加@interface@implementation部分即可。

+0

*咳嗽*它是'isEqual:',而不是'等于:'。如果尽管我现在找不到明确的评论,但是不需要工作的“哈希”,我也会感到非常惊讶。 – Tommy

+1

当我匆匆忙忙时,我应该很快停下来写下答案。谢谢,纠正。散列方法最重要的规则:如果两个对象相等,则它们的散列必须相同。从理论上讲,让* all *对象返回相同的散列是合法的,但是会导致字典,集合,缓存等查找性能很差。 – fzwo

相关问题