使用块下载图像,冻结UI
Using blocks to download image, freezing UI
在我的应用程序中,我正在使用块下载图像,但它冻结了我的 UI。我有一个网络 class,其中包含下载图像的方法,
-(void)downloadImageWithCompletionHandler:^(NSData *aData, NSError *error)aBlock;
我在我的视图控制器中调用上面的方法来下载图像。因此,一旦下载了图像,我就会使用 NSData 在图像视图中显示。网络 class 方法使用 NSURLConnection 方法下载图像。
[[NSURLConnection alloc] initWithRequest:theURLRequest delegate:self];
数据下载完成后,我将调用视图控制器的完成处理程序块。
但我不确定为什么我的 UI 冻结了?谁能帮我找出我哪里做错了?
提前致谢!
- (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;
}
});
}];
}
您需要在后台线程中下载图像以避免冻结 UI thread.There 是实现此目的的简单演示。
- (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);
}];
}
how to call this method.
[self downloadImageWithCompletionHandler:^(NSData *aData, NSError *error) {
// get UIImage.
UIImage *image = [UIImage imageWithData:aData];
}];
我找到问题了。问题不在块中或使用 NSUrlConnection 方法,它工作正常。问题是,我下载后将数据保存在文件中。此操作发生在阻塞 UI.
的主线程上
在我的应用程序中,我正在使用块下载图像,但它冻结了我的 UI。我有一个网络 class,其中包含下载图像的方法,
-(void)downloadImageWithCompletionHandler:^(NSData *aData, NSError *error)aBlock;
我在我的视图控制器中调用上面的方法来下载图像。因此,一旦下载了图像,我就会使用 NSData 在图像视图中显示。网络 class 方法使用 NSURLConnection 方法下载图像。
[[NSURLConnection alloc] initWithRequest:theURLRequest delegate:self];
数据下载完成后,我将调用视图控制器的完成处理程序块。
但我不确定为什么我的 UI 冻结了?谁能帮我找出我哪里做错了?
提前致谢!
- (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;
}
});
}];
}
您需要在后台线程中下载图像以避免冻结 UI thread.There 是实现此目的的简单演示。
- (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);
}];
}
how to call this method.
[self downloadImageWithCompletionHandler:^(NSData *aData, NSError *error) {
// get UIImage.
UIImage *image = [UIImage imageWithData:aData];
}];
我找到问题了。问题不在块中或使用 NSUrlConnection 方法,它工作正常。问题是,我下载后将数据保存在文件中。此操作发生在阻塞 UI.
的主线程上