2014-01-18 38 views
3

我有这样的情况: 我从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的是在一个第二,但[内容查看movieTitle]在UI后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]; 
    }); 
0

好吧,我发现了一个解决方案,由于http://forums.macrumors.com/showthread.php?t=1473390

而不是创造新的队列中,我不得不从mainQueue得到参考。

+2

当数据被检索和解析时,这可能会阻止您的用户界面。最好的方法是让你的队列离开主线程,但当你想更新你的用户界面时回到主线程。 – Putz1103