延迟更新UI

时间:2014-01-18 17:11:39

标签: ios objective-c cocoa-touch

我有这种情况: 我从API获取数据,这些数据很快就会出现。当我在NSLog中推送它们时,一旦我请求它们就在那里。之后我解析它们(来自JSON)并尝试设置像UILabel或UIImageView这样的控件(如果是图像)。我想我检查数据推迟到最后一点的时间延迟 - 我的意思是我试图获取NSLog方法,我获取数据,解析等等,最后在UILabel的子类中的方法setText。

问题是什么? NSLogs中的内容很快就会出现,但在UI中会在...... 10-20秒后更新。 !可能是什么原因?

一段示例代码

{
[[contentView movieTitle] setText:movieTitle];
[[contentView movieYear] setText:movieYear];
[[contentView movieGenres] setText:movieGenres];
[[contentView movieDuration] setText:movieTime];
[[contentView movieDescription] setText:movieDescription];
[[contentView movieStarringName] setText:movieStarring];
[[contentView movieDirectorName] setText:movieDirector];

NSLog(@"--- %@", [contentView movieTitle].text);
}

这个NSLog会在一秒内出现,但UI中的[contentView movieTitle]会在10-20秒后自行更改。

我异步请求数据。 所有属性,如contentView或movieTitle,movieGenres等都是(非原子的,保留)。

2 个答案:

答案 0 :(得分:4)

您可能正在后台线程中进行UI更新(从Web服务获得返回,或解析JSON)。为了及时更新您的用户界面(并且可能不会崩溃应用程序),请在主线程中进行更新。这可以通过几种方式完成。最简单的(至少对我而言)是调用dispatch_async

    dispatch_async(dispatch_get_main_queue(), ^{
        [[contentView movieTitle] setText:movieTitle];
        [[contentView movieYear] setText:movieYear];
        [[contentView movieGenres] setText:movieGenres];
        [[contentView movieDuration] setText:movieTime];
        [[contentView movieDescription] setText:movieDescription];
        [[contentView movieStarringName] setText:movieStarring];
        [[contentView movieDirectorName] setText:movieDirector];
   });

答案 1 :(得分:0)

好的,我通过http://forums.macrumors.com/showthread.php?t=1473390

找到了解决方案

我必须从mainQueue获取引用,而不是创建新队列。