为什么我的ImageView没有做任何事情,至少是重绘?

时间:2013-06-19 20:25:03

标签: iphone ios multithreading ipad webview

我创建了一个循环浏览图像的函数(1.png,2.png,3.png,4.png,5.png)并将它们显示到UIImageView。我的想法是我正在加载一个网页,我希望这个imageview能够运行这个功能,基本上是一个加载图标。但是我不明白为什么它不起作用,就imageview而言,我什么也看不见。请帮忙!我的功能代码如下。我知道我在这里做错了,因为我测试的其他内容包括webview委托工作得很好。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    for(int c = 1; !webviewLoaded; c++)
    {
        c = c % 6;
        if(c == 6)
            c = 1;
        NSString *numberString = [NSString stringWithFormat:@"%d.png", c];
        UIImage *img = [UIImage imageNamed:numberString];
        [self.loadingImage setImage:img];
        sleep(1);
    }
});

1 个答案:

答案 0 :(得分:0)

因为您正在后台线程上执行UI内容,所以不应该从后台线程更改UI组件。

您可以按以下方式更改代码:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
  dispatch_async(dispatch_get_main_queue(), ^{
    for(int c = 1; !webviewLoaded; c++)
    {
        c = c % 6;
        if(c == 6)
            c = 1;
        NSString *numberString = [NSString stringWithFormat:@"%d.png", c];
        UIImage *img = [UIImage imageNamed:numberString];
        [self.loadingImage setImage:img];
        sleep(1);
    }
  }
});

这段代码可以工作,但有点无用,它会给你的结果不如你期望的那样好,因为你正在做的是创建一个单独的线程(操作)只是为了从它调用UI线程这效率不高。

你应该做的是完全删除这样的发送:

   for(int c = 1; !webviewLoaded; c++)
    {
            c = c % 6;
            if(c == 6)
                c = 1;
            NSString *numberString = [NSString stringWithFormat:@"%d.png", c];
            UIImage *img = [UIImage imageNamed:numberString];
            [self.loadingImage setImage:img];
            sleep(1);
    }

这也可以,但请确保将这些文件@"%d.png添加到项目中。

因为您不熟悉GCD,所以good tutorial