0

ここで、URL から画像をダウンロードし、キャッシュ ディレクトリに保存します。キャッシュされたパスから画像を取得しましたが、画像を取得するのに苦労しました。ローカル パスから画像を取得する代替ソリューションはありますか

ここで、ローカルパスから画像を取得するコードを共有しました。

NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString *path = [NSString stringWithFormat:@"%@/%@", cachePath,[[imageurl componentsSeparatedByString:@"/"]lastObject]];
UIImage *image = [UIImage imageWithContentsOfFile:path];
4

1 に答える 1

0

画像のダウンロードとキャッシュを処理する NSObject クラスを作成する必要があります。例

インターフェイスファイル

        #import <Foundation/Foundation.h>

            @interface ImageCache : NSObject
            {
             UIImage *background;
            }
   @property (nonatomic,retain) UIImage *background;         
            -(void)getImages;
            -(void) storeImages;
            -(void) clearCache;

    @end

実装

    @implementation ImageCache

        @synthesize background;


            - (void) cacheImage: (NSString *) ImageURLString : (NSString *)imageName
            {
                NSURL *ImageURL = [NSURL URLWithString: ImageURLString];

                // Generate a unique path to a resource representing the image you want

                NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
                NSString *docDir = [paths objectAtIndex: 0];
                NSString *docFile = [docDir stringByAppendingPathComponent: imageName];

                // Check for file existence
                if(![[NSFileManager defaultManager] fileExistsAtPath: docFile])
                {
                    // The file doesn't exist, we should get a copy of it

                    // Fetch image
                    NSData *data = [[NSData alloc] initWithContentsOfURL: ImageURL];

                    UIImage *image = [[UIImage alloc] initWithData: data];

                    // Is it PNG or JPG/JPEG?
                    // Running the image representation function writes the data from the image to a file
                    if([ImageURLString rangeOfString: @".png" options: NSCaseInsensitiveSearch].location != NSNotFound)
                    {

                        [UIImagePNGRepresentation(image) writeToFile: docFile atomically: YES];

                    }
                    else if
                    (
                            [ImageURLString rangeOfString: @".jpg" options: NSCaseInsensitiveSearch].location != NSNotFound || 
                            [ImageURLString rangeOfString: @".jpeg" options: NSCaseInsensitiveSearch].location != NSNotFound
                    )
                    {
                        [UIImageJPEGRepresentation(image, 100) writeToFile: docFile atomically: YES];
                    }
                }
            }

            - (UIImage *) getCachedImage : (NSString *)imageName
            {

                NSArray *paths = NSSearchPathForDirectoriesInDomains
                (NSDocumentDirectory, NSUserDomainMask, YES);
                NSString *documentsDirectory = [paths objectAtIndex:0];
                NSString* cachedPath = [documentsDirectory stringByAppendingPathComponent:imageName];

                UIImage *image;

                // Check for a cached version
                if([[NSFileManager defaultManager] fileExistsAtPath: cachedPath])
                {
                    image = [UIImage imageWithContentsOfFile: cachedPath]; // this is the cached image
                }else
                {
                    NSLog(@"Error");
                }

                return image;
            }

        -(void)getImages
        {    
//I just googled background image and took first image I found for this example
         NSString *backgroundURL = @"http://www.dvd-ppt-slideshow.com/images/ppt-background/background-3.jpg";  
        [self cacheImage:backgroundURL: @"Background"];

        }

    -(void) clearCache
    {
    //If you ever need to clear the cache for whatever reason, good to have a method to handle it    
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *docDir = [paths objectAtIndex: 0];
        NSString *docFile1 = [docDir stringByAppendingPathComponent: @"Background"];
        NSFileManager *fileManager = [NSFileManager defaultManager];
        [fileManager removeItemAtPath:docFile1 error:NULL];

    }

    -(void) storeImages
    {
        background = [self getCachedImage:@"Background"];
    }

@end

私が与えた例では、1つの画像を使用しました。しかし、あなたは私が確信している考えを得る. そのイメージをダウンロードして保存する場合は、次のようにします。ViewController に ImageCache クラスをインポートして呼び出すだけです

ImageCache *cacheMe = [[ImageCache alloc] init];
   [cache getImages];
    [cacheMe storeImages];
    UIImageView *image = [[UIImageView alloc] initWithImage:[cacheMe background]];

そして、それはあなたがする必要があるすべてです。キャッシング専用のクラスがある場合は、はるかに簡単です。それが役立つことを願っています!!

編集:アップデートは2行のコードを忘れていました。私はそれを自分でテストしましたが、今はうまくいくはずです

于 2012-08-13T10:11:59.950 に答える