如何实现等待被动函数调用完成的swift3函数?比如facebook sdk

如何实现等待被动函数调用完成的swift3函数?比如facebook sdk,swift,facebook,completion,Swift,Facebook,Completion,我想实现一个类似facebook登录api的swift3函数。 以下是facebook的示例代码:() 请参阅完成块中的函数“loginManager.logIn”返回“loginResult”。登录结果应该在oauth调用Appdelegate中的sdk函数后创建 public func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:])

我想实现一个类似facebook登录api的swift3函数。 以下是facebook的示例代码:()

请参阅完成块中的函数“loginManager.logIn”返回“loginResult”。登录结果应该在oauth调用Appdelegate中的sdk函数后创建

public func application(_ app: UIApplication, open url: URL, options: 
[UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {

return FBSDKApplicationDelegate.sharedInstance().application(
  app,
  open: url as URL!,
  sourceApplication: 
options[UIApplicationOpenURLOptionsKey.sourceApplication] as! String,
  annotation: options[UIApplicationOpenURLOptionsKey.annotation]
)
}

public func application(_ application: UIApplication, open url: URL, 
sourceApplication: String?, annotation: Any) -> Bool {
return FBSDKApplicationDelegate.sharedInstance().application(
  application,
  open: url as URL!,
  sourceApplication: sourceApplication,
  annotation: annotation)
}
我尝试在函数中使用DispatchSemaphore来等待结果。 但是它阻塞了我的主线程,使我的SafariViewController冻结。 有没有更好的解决方案来实现像facebook这样的swift3功能


非常感谢

我使用DispatchGroup来解决我的问题。 我在登录函数中调用dispatchGroup.enter()。 并将
onSuccess()
放入
dispatchGroup.notify

并在Appdelegate中调用的另一个函数中调用
dispatchGroup.leave()

对不起,我不确定我是否理解您的问题,
loginManager.logIn
不会返回完成块,它实际上会接收一个完成块作为参数,正如您在Facebook文档中看到的:
public func logIn(权限:[ReadPermission]=[.PublicProfile],viewController:UIViewController?=nil,完成:((LoginResult)->Void)?=nil)
是的,但是完成块中的loginResult应该在Appdelegate中的函数调用之后创建。我想知道如何实现这种等待被动函数调用结果的函数。现在我明白了,使用RXSwift或类似的工具实现这种功能非常好。=]
public func application(_ app: UIApplication, open url: URL, options: 
[UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {

return FBSDKApplicationDelegate.sharedInstance().application(
  app,
  open: url as URL!,
  sourceApplication: 
options[UIApplicationOpenURLOptionsKey.sourceApplication] as! String,
  annotation: options[UIApplicationOpenURLOptionsKey.annotation]
)
}

public func application(_ application: UIApplication, open url: URL, 
sourceApplication: String?, annotation: Any) -> Bool {
return FBSDKApplicationDelegate.sharedInstance().application(
  application,
  open: url as URL!,
  sourceApplication: sourceApplication,
  annotation: annotation)
}