我创建了一个循环浏览图像的函数(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);
}
});
答案 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