2013-04-07 3 views
3

Уважаемые полки,Наиболее распространенный способ загрузки UIImage из Интернета

Я сбился с пути.

В моем приложении я загружаю 2 изображения из Интернета, например:

-(void)loadImages 
{ 
    ... 

    image1 = [UIImage imageWithData:[NSData dataWithContentsOfURL:imgUrl1]]; 
    image2 = [UIImage imageWithData:[NSData dataWithContentsOfURL:imgUrl2]]; 
} 

Для того, чтобы не блокировать основной поток, я использую НОД:

dispatch_async(dispatch_get_global_queue(0,0), ^{ 
      [self loadImages]; 

После этого, Я использую эти изображения в своих UITableView:

if (indexPath.row == 0) 
    { 
     cell.imageView.image = image1; 
    } 
    else 
    { 
     cell.imageView.image = image2; 
    } 

Th Я решил добавить UIActivityIndicator, но столкнулся с некоторыми проблемами. Я понимаю, что мой код неверен. Я видел, что люди использовали NSURLRequest и NSURLConnection для загрузки изображений и добавления UIActivityIndicator.

Не могли бы вы рассказать мне, какой самый стандартный способ загрузки изображений? Что я должен переписать?

ответ

3

Я предлагаю вам использовать AsyncImageView красивую реализацию Nicklockwood -father iCarousel.

https://github.com/nicklockwood/AsyncImageView

очень проста в использовании.

#import "AsyncImageView.h" 

и всего изображенияПросмотрите это.

[imageView setImage:@"default.png"]; 
    [imageView setImageURL:@"whateverurl/whateverimage.png"]; 

В вашем случае это будет: [cell.imageView setImageURL: @ "yourURL"];

Это работает как шарм, и мой код находится в производстве.Но если вы все еще хотите, чтобы ваш код работал, используйте:

UIActivityIndicator *activity =[[UIActivityIndicator alloc] initWithStyle:UIActivityIndicatorWhite]; 
[activity setFrame:CGRectMake(100,100,30,30)]; 
[self.view addSubview:activity]; 

dispatch_queue_t dispatchQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0); 
dispatch_async(dispatchQueue, ^(void) 
{ 
    [activity startAnimating]; 
[self loadImages]; 
dispatch_sync(dispatch_get_main_queue(), ^{ 
[yourTableView reloadData]; 
[activity stopAnimating]; 
[activty setHidden:YES]; 
}); 
}); 
+0

Спасибо, действительно отличное решение. – SmartTree

+0

Пробовала ли я свою реализацию? Работала ли она? Упростите или согласитесь, если вы классные мои ан. – satheeshwaran

+0

Его классный, отлично работает, спасибо! – SmartTree

2

Я могу вам сказать, что я обычно делаю, если я хочу использовать свой собственный код

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ 
    NSData * imageData = [NSData dataWithContentsOfURL:_pictureURL]; 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     imageView.image = [UIImage imageWithData:imageData]; 
    }); 
}); 

В противном случае вы можете рассмотреть UIImageView+AFNetworking категорию, добавляющий метод

setImageWithURLRequest:placeholderImage:success:failure: 

к UIImageView.

+0

Спасибо за код и рамки! – SmartTree

+0

Я сделал upvote :) – SmartTree

0

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

Чтобы использовать индикатор активности этого:

-(void)loadImages 
{ 
    UIActivityIndicator *indicator = ... 

    ... 
    [indicator startAnimating]; 
    image1 = [UIImage imageWithData:[NSData dataWithContentsOfURL:imgUrl1]]; 
    image2 = [UIImage imageWithData:[NSData dataWithContentsOfURL:imgUrl2]]; 
    [indicator stopAnimating]; 
} 

Малый нит - лично я бы использовал:

cell.imageView.image = (0 == indexPath.row ? image1 : image2) 

как никто, кажется, ценят в C 'условного expressoin'. Конец небольшой нит.

+0

Спасибо GoZoner! Но я понятия не имею, как я могу использовать UIActivityIndicator в этом случае, потому что я не знаю, когда загружается изображение, поэтому я могу остановить анимацию индикатора. Я видел, что если вы используете NSURLConnection, вы можете использовать стандартные методы, такие как '- (void) connectionDidFinishLoading: (NSURLConnection *) theConnection' и узнать, когда загружается изображение. Спасибо за нит, я об этом не думал. – SmartTree

+0

См. Edit; Я добавил, где указать UIActivityIndicator. – GoZoner

+0

'dataWithContentsOfURL:' является синхронным методом. Этот код блокирует пользовательский интерфейс. –

Смежные вопросы