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

Posted

技术标签:

【中文标题】为啥我的 ImageView 没有做任何事情,至少没有重绘?【英文标题】:Why isn't my ImageView doing anything, at least redrawing?为什么我的 ImageView 没有做任何事情,至少没有重绘? 【发布时间】:2013-06-19 20:25:02 【问题描述】:

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

【问题讨论】:

你应该阅读关于 UIImageView 的文档。它内置了动画。 【参考方案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,这里是good tutorial

【讨论】:

@MarcusAdams 是的,他可以,但他发布了一段代码,我不知道他是如何使用它的,所以我发布了该代码的解决方案,但我认为他正在尝试要做(只需从项目中加载一些图像)不需要任何类型的dispatch,因为没有对图像或其他计算进行繁重的处理,这就是我添加第二段代码的原因;) 感谢您的帮助和资源。仅供参考,您的建议只是部分解决方案。为了使其正常工作,您只需要将第二个块放在正在更改的 UI 周围,因为我仍然感谢您抽出时间

以上是关于为啥我的 ImageView 没有做任何事情,至少没有重绘?的主要内容,如果未能解决你的问题,请参考以下文章

为啥json没有做任何事情?

为啥 .catch() 没有做任何事情?

为啥这个正则表达式替换语句没有做任何事情? [复制]

FragmentTransaction 没有做任何事情

npm start 完全没有做任何事情

RemoteNotifications 没有注册/没有做任何事情