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



我创建了一个函数,它将循环浏览图像(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这里有一个很好的教程

最新更新