【问题标题】:Completion block thread完成块线程
【发布时间】:2014-08-18 10:12:59
【问题描述】:

我有这段代码:

[[FBController sharedController] getUserDetailsWithCompletionBlock:^(NSDictionary *details)
{
     // Updating UI elements
}];

我什么都不明白:当block 被触发时,secondary thread 仍在运行。 blockcompletion 应该自动在main thread 上执行不是更正确吗?

我知道我做错了什么,我需要一些解释。

【问题讨论】:

    标签: ios completion-block


    【解决方案1】:

    Facebook SDK 文档应该为您提供更多详细信息,但一般来说,行为良好的 SDK 会在调用 SDK 的同一线程上调用完成块。 SDK 可能执行的任何长时间运行或异步操作都应在单独的线程上运行,通常仅对 SDK 可见。那个单独的线程是否仍在运行,是 SDK 的一个实现细节 - 从客户端代码的角度来看,您不应该关心它。

    你可以像这样可视化它:

    Client Code (Main Thread) : [Request]--[Response]-[Continue Thread]-------[Completion Block]
                                    v          ^                                 ^
    SDK Code (Main Thread)    : [Immediate Operations]                           |
                                    v                                            |
    SDK Code (Private Thread) : [Long Running / Asynchronous Operations]----[Finished]
    

    在您发布的具体示例中,getUserDetailsWithCompletionBlock 方法没有“响应”,因此线程照常进行。

    拼图中缺少的部分可能是 - “我的完成块如何在主线程上执行”。本质上,这归结为 Runloop 系统。您的主线程实际上并不由您的代码拥有和操作,它在幕后。有一个 Main Runloop 定期寻找要做的事情。当有事情要做时,它会在主线程上按顺序操作这些事情。当这些事情完成后,它会回到寻找其他事情要做。 SDK 基本上将您的完成块添加到主运行循环中,因此下次触发时,您的块就在那里等待执行。

    runloop 可能正在做的其他事情是:

    1. 界面更新
    2. 从 UI 代码委托回调
    3. 处理定时器
    4. 触摸处理

    等等……等等……

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多