2013-11-15 2 views
2

Я пытаюсь вставить и изображение в UIImageView с URL-адреса. Для этого я использовал следующий код. При запуске программы застревает наЗагрузка изображения из URL в UIImageVIew динамически

NSURL *url = [NSURL URLWithString:urlstring]; 

В приведенном ниже коде, и это показывает «Thread 1: сигнал SIGABRT» на этой конкретной линии. Может кто-нибудь помочь мне с этим и сказать, правильный ли формат, который я использовал, или то, что я сделал неправильно?

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
static NSString *CellIdentifier = @"newoffer"; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 
if (cell==nil) 
{ 
    cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
} 
NSDictionary *temp = [product objectAtIndex:indexPath.row]; 
UILabel *Label = (UILabel *)[cell viewWithTag:201]; 
Label.text = [temp objectForKey:@"item_name"]; 
UIImageView *Image = (UIImageView *)[cell viewWithTag:200]; 
NSString *urlstring=[temp objectForKey:@"image_url"]; 
NSURL *url = [NSURL URLWithString:urlstring]; 
NSData *data = [NSData dataWithContentsOfURL:url]; 
Image.image = [UIImage imageWithData:data]; 

return cell; 

} 
+3

Если возможно, разместите свой URL-адрес здесь –

+0

Если вы все еще сталкиваетесь с какой-либо проблемой, напишите здесь, если мой ответ поможет вам, пожалуйста, отметьте мой ответ правильно. –

ответ

8

Изменить этот код:

NSURL *url = [NSURL URLWithString:urlstring]; 
NSData *data = [NSData dataWithContentsOfURL:url]; 
Image.image = [UIImage imageWithData:data]; 

To:

dispatch_queue_t myqueue = dispatch_queue_create("myqueue", NULL); 

    // execute a task on that queue asynchronously 
    dispatch_async(myqueue, ^{ 
NSURL *url = [NSURL URLWithString:[urlstring stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];; 
NSData *data = [NSData dataWithContentsOfURL:url]; 
dispatch_async(dispatch_get_main_queue(), ^{ 
Image.image = [UIImage imageWithData:data]; //UI updates should be done on the main thread 
    }); 
    }); 

Как уже отмечалось другими, библиотека Кэширование изображений как SDWebImage поможет много, потому что даже с этой реализации, вы просто нажать скачать обрабатывать фоновый поток, чтобы пользовательский интерфейс не застревал, но вы ничего не кешируете.

+0

Это сработало ... Спасибо ... – Spidy

0

NSData *data = [NSData dataWithContentsOfURL:url];

будет загружать ImageData синхронно, это означает, что основной поток будет заблокирован.

Используйте проект на github: SDWebImage для асинхронной загрузки изображений и кеша.

0

Есть, вероятно, лучшие библиотеки, которые делают это сейчас, но я всегда использовал это для своих проектов, и он хорошо работает: AsyncImageView. Есть и другие варианты, такие как SDWebImage

Но в принципе, вы не хотите использовать

NSData *data = [NSData dataWithContentsOfURL:url]; 

, потому что он будет блокировать основной поток до тех пор, пока изображение не загружается. Чтобы этого избежать, вы можете использовать что-то асинхронное, например, две вышеупомянутые библиотеки.

Например, с AsyncImageView, он становится столь же легко, как:

myImageView.imageURL = someNSURL; 
3

Попробуйте

[image setImage:[UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://www.vbarter.com/images/content/1/9/19517.jpg"]]]]; 

Для асинхронной загрузки

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

[image setImage:[UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://www.vbarter.com/images/content/1/9/19517.jpg"]]]]; 

}); 

если URL является динамическим, то

NSString *stringUrl; // this can be any valid url as string 

[image setImage:[UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:stringUrl]]]]; 
+0

@ Ананд Когда я использую приведенный выше код, он работает. Но URL-адрес динамичен и варьируется. Поэтому, когда я помещаю изображение в объект NSString, возникает вышеупомянутая проблема. – Spidy

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