所以我目前有以下内容:
- 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()函数中设置要调用的回调函数.
这可能是实现它的一种方式:
- 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