使用块下载图像,冻结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.

的主线程上