#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];
});
});