swift - 如何从系统函数的完成处理程序闭包中返回?
Posted
技术标签:
【中文标题】swift - 如何从系统函数的完成处理程序闭包中返回?【英文标题】:swift - how to return from a within a completion handler closure of a system function? 【发布时间】:2018-01-30 13:55:29 【问题描述】:我知道这行不通,因为 completion handler
在 background Thread
上,但是
我应该在哪里调度主队列或者我还有什么 怎么办?
这是代码:
static func isNotificationNotDetermined() -> Bool
var isNotDetermined = false
UNUserNotificationCenter.current().getNotificationSettings (notificationSettings) in
switch notificationSettings.authorizationStatus
case .notDetermined:
isNotDetermined = true
case .authorized:
isNotDetermined = false
case .denied:
isNotDetermined = false
return isNotDetermined
【问题讨论】:
在你的情况下,问题不在于后台线程,没关系(你不对 UI 做任何事情),它是“异步”的事实。寻找“异步 Swift 关闭”。你会经常得到关于 JSON/WebAPICall 的答案,但情况显然是一样的。 【参考方案1】:你不能这样做; getNotificationSettings
是异步的,因此您应该在方法中传递一个闭包并在切换后立即调用。
像这样的:
static func isNotificationNotDetermined(completion: (Bool) -> Void)
UNUserNotificationCenter.current().getNotificationSettings (notificationSettings) in
var isNotDetermined = false
switch notificationSettings.authorizationStatus
case .notDetermined:
isNotDetermined = true
case .authorized:
isNotDetermined = false
case .denied:
isNotDetermined = false
// call the completion and pass the result as parameter
completion(isNotDetermined)
然后你会这样调用这个方法:
YourClass.isNotificationNotDetermined isNotDetermined in
// do your stuff
【讨论】:
【参考方案2】:你不能那样做。这不是因为完成处理程序在后台线程上。
这是因为函数getNotificationSettings()
是异步的。在您得到答案之前,它会立即返回。
想象你正在做晚饭,你问你的女儿“你哥哥会回家吃晚饭吗?”您的女儿需要打电话给您的儿子并找出答案。你一问就不会得到问题的答案。您必须等待您的女儿找到电话,拨打电话并向您报告。
异步函数就是这样。函数返回时答案未知。这就是完成处理程序的用途。一旦确定了答案,它就会执行一段代码。
【讨论】:
是的,但我不能将返回值放在完成处理程序中,这就是问题所在。 这是一个异步 API。不要与之抗争。编写您的代码,以便它可以对闭包内部的状态确定做出反应。 @Gereon 说了什么。您不能编写函数来返回真/假答案。这是不可能的。您需要编写函数来获取一个完成处理程序,该处理程序在异步getNotificationSettings()
函数竞争后执行。
查看@RicoCrescenzio 的回答。他重写了你的 isNotificationNotDetermined()
函数来关闭,就像你应该做的那样。 (已投票)以上是关于swift - 如何从系统函数的完成处理程序闭包中返回?的主要内容,如果未能解决你的问题,请参考以下文章