如何实现等待被动函数调用完成的swift3函数?比如facebook sdk
我想实现一个类似facebook登录api的swift3函数。 以下是facebook的示例代码:() 请参阅完成块中的函数“loginManager.logIn”返回“loginResult”。登录结果应该在oauth调用Appdelegate中的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] = [:])
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)
}