在我的应用程序中,我使用块下载图像,但它冻结了我的UI。我有一个网络类,其中包含下载图像的方法,
-(void)downloadImageWithCompletionHandler:^(NSData *aData, NSError *error)aBlock;
我在视图控制器中调用上面的方法来下载图像。因此,一旦下载图像,我使用NSData在图像视图中显示。网络类方法使用NSURLConnection方法下载图像。
[[NSURLConnection alloc] initWithRequest:theURLRequest delegate:self];
数据下载完成后,我将调用视图控制器的完成处理程序块。
但我不确定为什么我的UI会冻结?任何人都可以帮我找到我做错的地方吗?
提前致谢!
答案 0 :(得分:1)
- (void) setThumbnailUrlString:(NSString *)urlString
{
NSString *url= [NSString stringWithFormat:@"%@",urlString];
//Set up Request:
NSMutableURLRequest *request = [[NSMutableURLRequest alloc]init];
[request setURL:[NSURL URLWithString:url]];
NSOperationQueue *queue=[[NSOperationQueue alloc] init];
if ( queue == nil ){
queue = [[NSOperationQueue alloc] init];
}
[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse * resp, NSData *data, NSError *error)
{
dispatch_async(dispatch_get_main_queue(),^
{
if ( error == nil && data )
{
UIImage *urlImage = [[UIImage alloc] initWithData:data];
_headImageView.image=urlImage;
_backgroundImageView.image=urlImage;
}
});
}];
}
答案 1 :(得分:0)
您需要在后台线程中下载图像以避免冻结UI线程。有一个简单的演示来实现此目的。
- (void)downloadImageWithCompletionHandler:(void(^)(NSData *aData, NSError *error))aBlock {
NSURLRequest *theURLRequest = nil; // assign your request here.
NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];
[NSURLConnection sendAsynchronousRequest:theURLRequest queue:mainQueue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
// UIThread.
aBlock(data,connectionError);
}];
}
如何调用此方法。
[self downloadImageWithCompletionHandler:^(NSData *aData, NSError *error) {
// get UIImage.
UIImage *image = [UIImage imageWithData:aData];
}];
答案 2 :(得分:0)
我弄明白了这个问题。问题不在块或使用NSUrlConnection方法,它正常工作。问题是,我下载后将数据保存在文件中。此操作发生在阻止UI的主线程上。