ios - 延迟更新UI

标签 ios objective-c cocoa-touch

我有这样的情况: 我从 API 获取数据,这些数据很快就会出现。当我将它们推送到 NSLogs 中时,一旦我请求它们就在那里。之后,我解析它们(从 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 等所有属性都是(非原子的,保留的)。

最佳答案

您可能会在后台线程中进行 UI 更新(您从网络服务获取返回值或解析 JSON)。为了及时更新您的 UI(并且不至于使应用程序崩溃),请在主线程中进行更新。这可以通过几种方式完成。最简单的(至少对我而言)是调用 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];
   });

关于ios - 延迟更新UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21207238/

相关文章:

iOS 6 CLLocationManager 最后位置

iphone - 将 UI 元素添加到自定义 UIView

iphone - 如何将静态广告横幅添加到 UITableViewController 中?

ios - 在 iOS 和 iPhone 上,如何绘制到位图并在 drawRect 中显示?

ios - 检测 NSString 中的 URL

ios - iOS App Bundle 中的多个本地化 .strings 文件

iphone - 如何在当前时间添加时间

ios - 使用 JSONModel 序列化自定义对象

iOS 是静态框架还是动态框架?

ios - 谷歌地图 - 本地图放大时让路线沿着街道