0

我做了一个函数,它将循环显示图像(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);
    }
});
4

1 回答 1

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这里是一个很好的教程

于 2013-06-19T20:44:48.813 回答