ios - 完成 block 线程

标签 ios completion-block

我有这段代码:

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

我不明白一件事:当 block 被触发时,secondary thread 仍在运行。 block 完成应该在主线程上自动执行不是更正确吗?

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

最佳答案

Facebook SDK 文档应该为您提供更多详细信息,但一般来说,性能良好的 SDK 会在调用 SDK 的同一线程上调用完成 block 。 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 方法没有“响应”,因此线程照常进行。

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

runloop 可能做的其他事情是:

  1. 用户界面更新
  2. 委托(delegate)来自 UI 代码的回调
  3. 处理计时器
  4. 触摸处理

等...等...

关于ios - 完成 block 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25360879/

相关文章:

ios - 创建一个不返回任何内容但在完成时执行另一个函数的完成 block ?

ios - 如何在objective-c ios中等待完成 block 完成

ios - swift init 可选的数组包装

ios - 保存自定义 Objective-c 对象层次结构以实现持久性的最佳方法

ios - 在 UIView beginAnimations 完成后做一个 Action

objective-c - 如何使一个方法等待另一个(异步)方法完成后再继续执行?

ios - 如何为方法编写和传递完成 block 参数?

iphone - 传递动画数组时应用程序崩溃

objective-c - 为 app ios 创建一个设置 View

ios - 如何使用 SwiftUI 在 NavigationView 中正确包含 "Add Item"按钮?