所以我目前有以下内容:
class ViewController: UIViewController { class Identity{ let baseUrl = "superSecretURL" var _username: String = "" var _password: String = "" var _apiKey: String = "" init(){ } init(username: String,apiKey: String){ _username = username _apiKey = apiKey } init(username: String,password: String){ _username = username _password = password } func loginPassword() -> String{ var loginJSON = ["auth": ["passwordCredentials": ["username": _username,"password": _password]]]; var returnJSON: String request(.POST,baseUrl,parameters: loginJSON,encoding: .JSON) .responseJSON { (request,response,data,error) in if let anError = error { // got an error in getting the data,need to handle it println("error calling POST on /posts") println(error) } else if let data: AnyObject = data { // handle the results as JSON,without a bunch of nested if loops let post = JSON(data) // to make sure it posted,print the results println("JSON Returned") } } } } var i = Identity(username: "secretName",password: "complicatedPassword") override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view,typically from a nib. println("Before Call") println("After Call") } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } }
基本上我希望能够调用println(“Before Call”)然后从loginPassword()方法接收响应,然后println(“After Call”).这是我相信同步,但我无法找到一种方法让它工作,整个线程的事情让我感到困惑.
我基本上希望能够说:
if i.loginPassword(){ // do some login stuff }else{ // do some error stuff }
任何帮助或指针赞赏.
您需要在loginPassword()函数中设置要调用的回调函数.
原文链接:https://www.f2er.com/swift/318595.html这可能是实现它的一种方式:
func loginPassword(callback: ((isOk: Bool)->Void)?) -> String{ var loginJSON = ["auth": ["passwordCredentials": ["username": _username,"password": _password]]]; var returnJSON: String request(.POST,encoding: .JSON) .responseJSON { (request,error) in if let anError = error{ // got an error in getting the data,need to handle it println("error calling POST on /posts") println(error) callback?(isOk: false) } else if let data: AnyObject = data{ // handle the results as JSON,without a bunch of nested if loops let post = JSON(data) // to make sure it posted,print the results println("JSON Returned") callback?(isOk: true) } } }
然后…
override func viewDidLoad() { super.viewDidLoad() var identity = Identity(username: "John Apleseed",apiKey: "213123123") identity.loginPassword { (isOK) -> Void in if (isOK) { //do good stuff here }else{ // do error handling here } } }
UPDATE
override func viewDidLoad() { super.viewDidLoad() var identity = Identity(username: "John Apleseed",apiKey: "213123123") identity.loginPassword(handlePasswordRequest) }
并且您可以添加尽可能多的回调处理程序,而无需乱搞一堆嵌套的闭包……
private func handlePasswordRequest(isOK: Bool){ if (isOK) { //do good stuff here }else{ // do error handling here } }
更新2
如果您需要在调用层次结构中深入调用回调,则需要将回调作为每个先前闭包的参数传递.
更新3
我会尝试一下RxAlamofire和RxSwift