完成块线程

时间:2014-08-18 10:13:00

标签: ios completion-block

我有这段代码:

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

我不明白一件事:当block被解雇时,secondary thread仍然在运行。如果completion的{​​{1}}应该自动在block执行,那么更正确吗?

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

1 个答案:

答案 0 :(得分:2)

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中,所以下次它触发时,你的块在那里等待执行。

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

  1. UI更新
  2. 从UI代码
  3. 委派回调
  4. 处理计时器
  5. 触摸处理
  6. 等等...等等......