【问题标题】:Perform updates on UI from the background thread, possible pitfalls从后台线程执行 UI 更新,可能的陷阱
【发布时间】:2015-12-04 02:27:06
【问题描述】:

我知道强烈建议只在主线程中更新 UI。否则可能会导致意外崩溃。

但我尝试使用这两种方式,但还没有遇到任何问题。也许我的场景很简单,问题只出现在复杂的代码中,但我想更深入地了解这件事。并尝试找出忽略此规则会导致 100% 程序中止或其他一些严重问题(死锁、竞争条件等)的情况。

也许你们中的一些人曾经遇到过这个“敌人”,或者还记得练习中的确切例子。 非常感谢代码(或伪代码)中可能的插图。

谢谢

【问题讨论】:

  • 例如尝试在后台线程中运行动画:)
  • 我知道动画应该只在主线程中完成,但例如在 RESTful 场景中,如果在后台发送请求,而不是获取数据并在 `UITableView 上调用例如`reloadData` `一切都会好的。

标签: ios multithreading user-interface


【解决方案1】:

整个 UIKit 曾经是线程不安全的,因此从后台线程调用几乎任何东西都会崩溃,几乎总是。现在情况好多了,但是使用 GCD,无论如何在主线程上更新 UI 都非常简单。当前的模式是这样的:

[someWorker runBackgroundOperationAndCall:^{
    dispatch_async(dispatch_get_main_queue(), ^{
        // update UI
    });
}];

这太简单了,我想它不值得再想一想。当我忘记从主线程更新 UI 时,它有时会起作用,有时不会 - UI 不会立即更新,出现奇怪的闪烁或类似的东西。使用线程,最好以官方认可的正确方式做事,否则你会在最意想不到的时候进入痛苦的世界。

(抱歉,我没有一个简短的 sn-p 来证明从后台线程更新 UI 时出现问题。)

【讨论】:

    猜你喜欢
    • 2012-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-10
    • 2013-06-04
    相关资源
    最近更新 更多