0

我有一个实例NSCache,例如:NSCache *imageCache;它基本上用于保存一些具有不同的远程“图像”值"@keys"。I alloc&init NSCache在开头的 Global 类中设置if else条件,如下所示:

if (self.imageCache == nil)
{
    self.imageCache = [[NSCache alloc] init];
}
else
{
    NSLog(@"cache set");
}

#import是所有的“全局类” ViewControllers,这样我就不必每次都解析图像。但问题是当我去其他地方时,ViewControllers似乎每次都如此。因为将图像加载为. 我认为条件没有完美运行,或者它不是检查设置与否的适当方法。谁能告诉我它有什么问题?还有一件事, The是从全局变量中使用的。 提前致谢。 祝你有美好的一天。NSCache allocinit1stVCif elseNSCacheimageCache

添加:

这是我将UIButtonsin加载UIScrollViewsubView. 这是UIViewClass我在我的“EveryViewController”中添加的一个,subView只要看看就if (cachedImage)行了。它工作正常。但是,当我想检查NSCache(iADImageCache) 是否设置时,它显示它没有设置。但是应该设置哪个。在这种情况下,我怎样才能iADImageCache用不同的@"Key"名字检查所有几个?再次感谢。

-(void) loadUIButton
{
    [self loadScrollView];
    for (int i = 0; i < [iADDisplayArray count]; i++)
    {
        adButtonOutLet = [[UIButton alloc] initWithFrame:CGRectMake(i*320, 0, ButtonWidth, ButtonHight)];

        currentAd = [iADDisplayArray objectAtIndex:i];

        NSString *path = currentAd.bannerIconURL;
        NSURL *url = [NSURL URLWithString:path];
        NSMutableURLRequest *requestWithBodyParams = [NSMutableURLRequest requestWithURL:url];
        NSData *imageData = [NSURLConnection sendSynchronousRequest:requestWithBodyParams returningResponse:nil error:nil];
        UIImage *originalImage = [UIImage imageWithData:imageData];

        UIImage *cachedImage =  [self.iADImageCache objectForKey:currentAd.bannerIconURL];
        if (cachedImage)
        {
            [adButtonOutLet setImage:cachedImage forState:UIControlStateNormal];
            //NSLog(@"OnecachedImage %@", cachedImage);
        }
        else
        {
            [self.iADImageCache setObject:originalImage forKey:currentAd.bannerIconURL];
            [adButtonOutLet setImage:originalImage forState:UIControlStateNormal];
            NSLog(@"OneimageCache %@", self.iADImageCache);
        }

        adButtonOutLet.userInteractionEnabled= YES;
        [adButtonOutLet setTag:i];
        [adButtonOutLet addTarget:self action:@selector(goToURL:) forControlEvents:UIControlEventTouchUpInside];

        [self.iADScrollView addSubview:adButtonOutLet];
    }
}
4

2 回答 2

1

您可以创建一个单例类,应用程序中的实例确实完成启动并通过所有视图控制器在任何地方使用它。在单例类中放置一个属性

@property(nonatomic,strong) NSCache* imageCache;

然后在单例类的 init 方法中只实例化一次。这样您就不必关心它,您只需将图像添加到该缓存中即可。当然,您必须根据该缓存中是否存在键来检查图像是否被缓存。

NSCache* globalCache = [SingletonClass sharedInstanceMethod].imageCache;
UIImage *imageX = [globalCache objectForKey: @"keyX"];
if (!imageX) {
    // download your image
    imageX = <Download method>;
    [globalCache setObject: imageX forKey: @"keyX"];
}

// Do your stuff (like showing the image)
....
...
..
.

希望能帮助到你

于 2014-09-10T10:58:13.060 回答
0

除非整个程序确实需要,否则我会建议另一种方法,通过添加类方法将缓存限制为实际需要使用它的类:

+ (NSCache *)staticCacheForClass
{
  static NSCache *staticCache;
  static dispatch_once_t onceToken;

  dispatch_once(&onceToken, ^
    staticCache = [NSCache new];
    staticCache.name = @"myCache";
  });

  return staticCache;
}

使用它 - 您可以将缓存的更改限制在使用它的类的内部,并避免创建另一个单例。在创建和销毁此类的实例时也会保留缓存。

也就是说,如果您需要从不同的类访问缓存,单例可能是一个可行的解决方案,因为缓存单例并不是真正的全局状态。

干杯。

于 2016-04-28T10:32:38.120 回答