我有这种情况: 我从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等都是(非原子的,保留)。
答案 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获取引用,而不是创建新队列。