1

Web からダウンロードした画像をデバイスのキャッシュに挿入する方法はありますか? 私のアプリケーションには、画像を含むビューがいくつかあります。すべての tableView に 25 ~ 30 個の画像があります。問題は、スクロール時に画像がロードされ、結果がスクロール時に画像のリロードに2〜3秒かかることです...見栄えがよくありません:)現時点では、各セルでNSURLRequestを使用しています。

NSURL* url = [NSURL URLWithString:article.articleImage];
NSURLRequest* request = [NSURLRequest requestWithURL:url];
[NSURLConnection sendAsynchronousRequest:request
queue:[NSOperationQueue mainQueue]
completionHandler:^(NSURLResponse * response,
NSData * data,
NSError * error) 
{
     if (!error)
     {
         UIImage* image = [[UIImage alloc] initWithData:data];
                                           MainImg.image = image;
                                           article.articleImg=image;
     }

}];

マルチスレッドを使用しようとしましたが、アプリケーションの起動に時間がかかりすぎます。アイデア?

4

4 に答える 4

0

この目的で NSURLCache を使用できます。昨日、私はこれで作業し、クラスを作成しました:

@interface MyURLCache : NSURLCache
@property (nonatomic, assign) NSTimeInterval timeAvaiable;
@end

@implementation MyURLCache

- (id)initWithMemoryCapacity:(NSUInteger)memoryCapacity diskCapacity:(NSUInteger)diskCapacity diskPath:(NSString *)path
{
    self = [super initWithMemoryCapacity:memoryCapacity diskCapacity:diskCapacity diskPath:path];
    if(self){
        _timeAvaiable = 5*60;//5 мин
    }
    return self;
}
- (id)init
{
    self = [super init];
    if(self){
        _timeAvaiable = 5*60;
    }
    return self;
}

+ (NSCachedURLResponse*)addInfoDataToCachedResponce:(NSCachedURLResponse*)cachedResponse
{
    NSMutableDictionary* newUserInfo = [@{@"LastUpdate" : @([[NSDate date] timeIntervalSince1970])} mutableCopy];
    if([cachedResponse userInfo])
        newUserInfo[@"UserInfo"] = [cachedResponse userInfo];

    return [[NSCachedURLResponse alloc] initWithResponse:[cachedResponse response]
                                                    data:[cachedResponse data]
                                                userInfo:newUserInfo
                                           storagePolicy:[cachedResponse storagePolicy]];
}

+ (NSCachedURLResponse*)removeInfoDataFromCachedResponce:(NSCachedURLResponse*)cachedResponse
{
    return [[NSCachedURLResponse alloc] initWithResponse:[cachedResponse response]
                                                    data:[cachedResponse data]
                                                userInfo:[cachedResponse userInfo][@"UserInfo"]
                                           storagePolicy:[cachedResponse storagePolicy]];
}

- (NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)request
{
    NSCachedURLResponse* result = [super cachedResponseForRequest:request];
    NSDate* lastUpdate = [NSDate dateWithTimeIntervalSince1970:[result.userInfo[@"LastUpdate"] doubleValue]];
    BOOL expired = fabs([lastUpdate timeIntervalSinceNow]) > _timeAvaiable;
    return expired? nil : [[self class] removeInfoDataFromCachedResponce:result];
}

- (void)storeCachedResponse:(NSCachedURLResponse *)cachedResponse forRequest:(NSURLRequest *)request
{
    [super storeCachedResponse:[[self class] addInfoDataToCachedResponce:cachedResponse] forRequest:request];
}

@end

そして、アプリがロードされたときにキャッシュを有効にするだけです:

MyURLCache *URLCache = [[MyURLCache alloc] initWithMemoryCapacity:4 * 1024 * 1024
                                                     diskCapacity:20 * 1024 * 1024
                                                         diskPath:[SDURLCache defaultCachePath]];
[NSURLCache setSharedURLCache:URLCache];

リクエストごとに、cachePolicy を NSURLRequestReturnCacheDataElseLoad に設定する必要があります。

または、AFNetworkingを使用してください:)

- (void)setImageWithURLRequest:(NSURLRequest *)urlRequest 
              placeholderImage:(UIImage *)placeholderImage 
                       success:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image))success
                       failure:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error))failure;
于 2013-06-13T12:20:40.027 に答える