dispatch_async没有效果

时间:2015-01-09 12:28:26

标签: ios objective-c grand-central-dispatch dispatch-async

我有多个按钮,我希望每个按钮都有一个来自网址的图片。 我试图做什么,它没有工作(按钮没有图像)。如果我在没有派遣的情况下尝试做同样的事情,那么它可以工作但是需要时间。我哪里错了?

UIImageView *imageView = [[UIImageView alloc] init];
dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    // Add code here to do background processing
    NSString *imageURL = pictureUrl[i];
    NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:imageURL]];
    imageView.image = [UIImage imageWithData:imageData];
    [bt setBackgroundImage:imageView.image forState:UIControlStateNormal];

    //
    dispatch_async( dispatch_get_main_queue(), ^{


    });
});

2 个答案:

答案 0 :(得分:3)

dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
     // Add code here to do background processing
     NSString *imageURL = pictureUrl[i];
     NSData *imageData  = [NSData dataWithContentsOfURL:[NSURL URLWithString:imageURL]];
     UIImage *image     = [UIImage imageWithData:imageData];
     dispatch_async(dispatch_get_main_queue(), ^{        
          [bt setBackgroundImage:image forState:UIControlStateNormal];

     });
});

您在后台执行所有操作,然后在主线程上不执行任何操作。而是在后台下载数据并在主线程上使用UI。也无需拥有imageView

答案 1 :(得分:2)

  1. 您报告imageDatanil

    NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:imageURL]]
    

    如果是这种情况,您应首先检查NSURL对象是否为nil

    NSURL *URL = [NSURL URLWithString:imageURL];
    NSLog(@"URL = %@", URL);
    NSData *imageData = [NSData dataWithContentsOfURL:URL];
    

    网址可能看起来不错,但只有通过查看NSURL值才能确认。

  2. 如果您似乎坚持,网址很好(并且您已确认NSURL不是nil),但NSData是仍然会出现nil,那么你应该使用一种不同的检索机制,一种返回NSError解释失败的原因。例如,您可以通过调用dispatch_async将此sendAsynchronousRequest替换为背景,如果NSDatanil,则查看NSError对象。

  3. 此时可能不用说,但请确保将UI控件的所有更新(例如图像视图)分派回主队列。