Как реализовать отложенную загрузку изображения без использования SDImageCache?

#objective-c

#objective-c

Вопрос:

Как реализовать отложенную загрузку изображения без использования ссылки ниже:

https://github.com/rs/SDWebImage

Примечание: я не хочу использовать какой-либо сторонний инструмент. Я хочу сделать это со своей стороны.

Комментарии:

1. чем использовать github.com/markofjohnson/HJCache

2. проверьте эту ссылку: https://www.natashatherobot.com/ios-how-to-download-images-asynchronously-make-uitableview-scroll-fast/

3. Я хочу использовать без использования какого-либо стороннего инструмента, спасибо Ronak

Ответ №1:

Если вы не хотите использовать какую-либо библиотеку (некоторые из них лицензированы MIT или public domain, поэтому я думаю, что единственная причина не использовать их — это то, что вы хотите научиться создавать ее самостоятельно).

Вот как это сделать простым и эффективным способом:

1. Поместите временное изображение-заполнитель в ваш ImageView.

2. Получите ваше изображение в фоновом потоке.

2-a: Если вам нужна функция кэширования, найдите кэшированное изображение.

2-b: если нет функции кэширования или нет кэшированного изображения, получите изображение из его источника.

2-c: если функция кэша, сохраните изображение в кэше.

3: В основном потоке покажите свое изображение в ImageView.

Псевдокод: (Я написал его на ходу, он не предназначен для запуска и может содержать ошибки, извините за это).

 -(void) lazilyLoadImageFromURL :(NSURL *)url{
    imageView.image = [UIImage imageNamed:@"Placeholder.png];


if([self cachedImageAvailableForURL:url){

imageView.image= [self cachedImageForURL:url];

}
else{

NSOperationQueue *queue = [NSOperationQueue mainQueue];
NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];

[NSURLConnection sendAsynchronousRequest:urlRequest queue:queue completionHandler:^(NSURLResponse * resp, NSData     *data, NSError *error) 
{
    dispatch_async(dispatch_get_main_queue(),^ 
                   {
                        if ( error == nil amp;amp; data )
                        {
                            UIImage *urlImage = [[UIImage alloc] initWithData:data];
                            imageView.image = urlImage;
                            [self saveImageInCache:image forURL:url];
                            }
                       });
    }];
}

}

-(BOOL) cachedImageAvailableForURL:(NSURL*):url{
        // check if there is a saved cached image for this url
 }
-(UIImage *) cachedImageForURL:(NSURL*):url{
        // returns the cached image for that url
}
-(void) saveImageInCache:(UIImage*) image forURL:(NSURL*)url{
        // saves the image in cache for the url
}
 

Конечно, это только один ИЗ ВОЗМОЖНЫХ СПОСОБОВ сделать это. Я пытался упростить это, но есть много лучших и более сложных способов сделать это.

Ответ №2:

Попробуйте:

        NSURL *imageURL = [NSURL URLWithString:@"www...."];

            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{

                NSData *imageData = [NSData dataWithContentsOfURL:imageURL];

                dispatch_async(dispatch_get_main_queue(), ^{
                    // Update the UI
                    self.imgVWprofile.image=[UIImage imageWithData:imageData];
                });
            });