使用块下载图像,冻结UI

时间:2015-08-05 12:30:40

标签: ios objective-c objective-c-blocks

在我的应用程序中,我使用块下载图像,但它冻结了我的UI。我有一个网络类,其中包含下载图像的方法,

-(void)downloadImageWithCompletionHandler:^(NSData *aData, NSError *error)aBlock;

我在视图控制器中调用上面的方法来下载图像。因此,一旦下载图像,我使用NSData在图像视图中显示。网络类方法使用NSURLConnection方法下载图像。

   [[NSURLConnection alloc] initWithRequest:theURLRequest delegate:self];

数据下载完成后,我将调用视图控制器的完成处理程序块。

但我不确定为什么我的UI会冻结?任何人都可以帮我找到我做错的地方吗?

提前致谢!

3 个答案:

答案 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的主线程上。