0

NSCacheのようなインスタンスがあります。NSCache *imageCache;基本的には、リモートの「イメージ」値を異なる で保持するために使用されます"@keys"。私は最初にグローバルクラスにalloc&いて、次のように条件を設定します:init NSCacheif else

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

毎回画像を解析する必要がないように、すべて#importの「グローバルクラス」を使用します。しかし、問題は、私が他の場所にViewControllers行くときです。と同じように画像の読み込みに時間がかかるためです。条件が完全に機能していないか、設定されているかどうかを確認する適切な方法ではないと思います。誰がそれの何が悪いのか教えてもらえますか? もう 1 つ、グローバル変数から使用されます。 前もって感謝します。 良い一日を過ごしてください。ViewControllersNSCache allocinit1stVCif elseNSCacheimageCache

添加:

UIButtonsこれは、 inUIScrollViewを as としてロードする方法subViewです。これはUIViewClass、「EveryViewController」に追加したものです。行subViewを見てくださいif (cachedImage)。それは正常に動作します。しかし、(iADImageCache)が設定されているかどうかを確認したい場合、NSCache設定されていないことがわかります。しかし、どれを設定する必要があります。この状況では、どうすればすべての名前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 メソッドで 1 回だけインスタンス化します。この方法では、気にする必要はなく、そのキャッシュに画像を追加するだけで済みます。もちろん、そのキャッシュ内のキーの存在に基づいて、画像がキャッシュされているかどうかを確認する必要があります。

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 に答える