我创建了一个函数,它将循环浏览图像(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);
}
});
因为你是在后台线程做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
这里有一个很好的教程