为啥在 requestAccessToEntity:completion 中使用 performSegueWithIdentifier 时使用 dispatch_async?

Posted

技术标签:

【中文标题】为啥在 requestAccessToEntity:completion 中使用 performSegueWithIdentifier 时使用 dispatch_async?【英文标题】:Why use dispatch_async when using performSegueWithIdentifier in requestAccessToEntity:completion?为什么在 requestAccessToEntity:completion 中使用 performSegueWithIdentifier 时使用 dispatch_async? 【发布时间】:2014-03-11 02:32:43 【问题描述】:

当我在完成块中调用 performSegueWithIdentifier 时,如果我不将调用包装在 dispatch_async 中,则实际上需要 10 秒才能真正发生 segue。但是,我可以在不将它们包装在同一个 dispatch_async 中的情况下做其他事情,例如做核心数据工作,或者记录“事物”...

任何关于其工作原理和原因的见解......我迷路了。如果这里不适合提出此类问题,我深表歉意。

EKEventStore *store = [[EKEventStore alloc] init];
[store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) 
    dispatch_async(dispatch_get_main_queue(), ^
        [self performSegueWithIdentifier:self.phaseSegue sender:self];
    );
];

【问题讨论】:

我遇到了一个问题,即 segue 加载在用户触摸屏幕之前不会触发,而不是延迟 10 秒,而是在请求访问的同一个完成块中,例如 question 。根据问题将其包装在 dispatch_async 中解决了这个问题,并且 segue 立即执行。 【参考方案1】:

来自documentation:

当用户点击以授予或拒绝访问时,将在任意队列上调用完成处理程序。

此外,所有与 UI 相关的内容必须在主队列中完成。这就是你需要dispatch_async的方式。

【讨论】:

以上是关于为啥在 requestAccessToEntity:completion 中使用 performSegueWithIdentifier 时使用 dispatch_async?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在参数周围使用 /*、*/ 以及为啥在提取数组长度时使用 >>>? [复制]

为啥 CoreGui Roblox 锁定在 DataModel 中,为啥受信任的用户不能使用 CoreScripts?

为啥 + 仅在客户端是 NaN?为啥不在 Node.js 中?

在执行语义分割任务时我应该减去图像均值吗?为啥或者为啥不?

为啥我们不能在 TypeScript 类中定义一个 const 字段,为啥静态只读不起作用?

为啥这个函数序言中没有“sub rsp”指令,为啥函数参数存储在负 rbp 偏移处?