0

Parse.com を使用してiOS アプリを作成しました。

私のアプリでは、ネットワークからの大量のデータを表示しました。

データをすばやくロードするために、 cache を使用しkPFCachePolicyCacheThenNetworkました。データを正常にロードしますが、画像をスクロールするとロードに時間がかかります。

最初に白い画像が読み込まれ、次に画像が読み込まれます。

Is there any solution like cache to display images in imageviews with out interruption.

ありがとう。

4

6 に答える 6

3

これにはSDWebImageを使用できます。

また、キャッシングの目的でNSCacheを使用することもできます。

于 2013-06-20T05:52:53.183 に答える
2

はい、AFNetworking UIImageviewカテゴリを使用でき、ソートされています

また、既存の画像を編集してから同じ URL からダウンロードする場合に通常必要となる特定の画像のキャッシュを無効にすることもできます。

-(void)setImageWithURL:(NSURL *)url
       placeholderImage:(UIImage *)placeholderImage

このブログで述べたように

もう 1 つのオプションは、キャッシュを更新する機能を備えたASImageViewです。

于 2013-06-20T05:53:22.170 に答える
1

私は gcd の助けを借りてコードを書きます.imageViewのオブジェクトを渡し、urlを渡すだけで、キャッシュなどのすべてのものを管理します.

-(void)downloadingServerImageFromUrl:(UIImageView*)imgView AndUrl:(NSString*)strUrl{


strUrl = [strUrl encodeUrl];

NSString* theFileName = [NSString stringWithFormat:@"%@.png",[[strUrl lastPathComponent] stringByDeletingPathExtension]];


NSFileManager *fileManager =[NSFileManager defaultManager];

NSString *fileName = [NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"tmp/%@",theFileName]];



imgView.backgroundColor = [UIColor darkGrayColor];
UIActivityIndicatorView *actView = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];
[imgView addSubview:actView];
[actView startAnimating];

CGSize boundsSize = imgView.bounds.size;
CGRect frameToCenter = actView.frame;
// center horizontally
if (frameToCenter.size.width < boundsSize.width)
frameToCenter.origin.x = (boundsSize.width - frameToCenter.size.width) / 2;
else
frameToCenter.origin.x = 0;




 // center vertically
if (frameToCenter.size.height < boundsSize.height)
frameToCenter.origin.y = (boundsSize.height - frameToCenter.size.height) / 2;
else
frameToCenter.origin.y = 0;

actView.frame = frameToCenter;



dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{

NSData *dataFromFile = nil;
NSData *dataFromUrl = nil;

dataFromFile = [fileManager contentsAtPath:fileName];
if(dataFromFile==nil){
    dataFromUrl=[[[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:strUrl]] autorelease];                      
}

dispatch_sync(dispatch_get_main_queue(), ^{

    if(dataFromFile!=nil){
        imgView.image = [UIImage imageWithData:dataFromFile];
    }else if(dataFromUrl!=nil){
        imgView.image = [UIImage imageWithData:dataFromUrl];  
        NSString *fileName = [NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"tmp/%@",theFileName]];

        BOOL filecreationSuccess = [fileManager createFileAtPath:fileName contents:dataFromUrl attributes:nil];       
        if(filecreationSuccess == NO){
            NSLog(@"Failed to create the html file");
        }

    }else{
        imgView.image = [UIImage imageNamed:@"NO_Image.png"];  
    }
    [actView removeFromSuperview];
    [actView release];
    [imgView setBackgroundColor:[UIColor clearColor]];
});
});

}

于 2013-06-20T06:11:30.807 に答える
0

申し訳ありませんが、Parse はすでにこれらすべてのことを行っています。Parse は AFNetworking を使用して画像を取得し、それらを NSCache に格納し、ディスク キャッシュを非常に積極的に使用して、冗長なネットワーク トリップを完全に回避します (バージョンは URL の一部であるため、Parse は if-modified を使用する必要さえありません)。 -GET以来)。

発生する可能性のある最大の問題は、PFFile がダウンロードを抑制して、一度に 3 つのイメージしかダウンロードできないことです。実験の結果、これが最適な数値でした。これにより、ユーザーへのフィードバックが確実に増加し、スレッドが多すぎると一部の iOS デバイスのパフォーマンスが非常に低下するという厄介な問題が回避されました。私が提供できる最善のアドバイスは、可能であればいくつかの画像をプリフェッチすることです。前述のように、PFFile イメージは非常に積極的にキャッシュされます。kPFCachePolicy... スタッフは、古くなる可能性のあるクエリにのみ影響します。これらのクエリが指す画像は常にキャッシュされます (最初はオンデマンドでのみダウンロードされます)。

于 2013-06-20T16:41:38.723 に答える
0

バックグラウンドで画像をロードするためのコードは次のとおりです。このコードを確認してください

于 2013-06-20T05:48:05.263 に答える