等待闭包在SWIFT中的函数链接中间完成

时间:2015-02-05 04:04:34

标签: ios swift closures chaining

我想知道在代码运行到下一个函数之前是否可以等待闭包以函数链结束。

例如:

SomeSingletonClass.sharedInstance.bFunction()

如果它是sharedInstance的第一次调用,我希望bFunction()等到SingletonClass的init()中的闭包*结束。 是否可能以某种方式阻止UI?

*此闭包可能会显示授权访问授权警报,而bFunction()应等待用户对此警报的反应(或者根本不会调用bFunction,具体取决于用户的答案)。

感谢先进的任何建议。

更新

正如GoZoner建议的那样,我试图用init()阻止dispatch_semaphore_create() / signal() / wait()方法中的执行,但在这种情况下,应用程序被阻止,无法显示AlertView。

3 个答案:

答案 0 :(得分:1)

init()的{​​{1}}方法需要阻止其执行,直到“授予访问授权警报”为止。完成。完成后,SomeSingletonClass方法将恢复,init()属性将返回,sharedInstance方法将应用于返回的实例。

有很多方法可以阻止执行;您使用的内容取决于您的应用程序的多处理细节。

答案 1 :(得分:1)

您可以在Closure NSNotification

中发布NSNotificationCenter.defaultCenter().postNotificationName("weirdKeyName", object: nil)

听到该通知,并在通知到达后立即执行Closure代码时调用您的提醒或您需要做的任何事情:NSNotificationCenter.defaultCenter().addObserver(self, selector: "alertFunction", name: "weirdKeyName, object: nil)

alertFunction() {
  ...
}

等待NSNotification触发警报不会导致应用程序阻塞并等待关闭完成。

如果您愿意,也可以通过NSNotificationQueue

将通知发送到后台主题

答案 2 :(得分:0)

您是否考虑过您的代码

SomeSingletonClass.sharedInstance.bFunction()

可能住在主线程以外的线程中吗?

这样,sharedInstance函数(初始化SomeSingletonClass)可以请求主线程异步创建初始化值,信号量等待它完成吗?

这样,你就不会阻止主线程。