2015-05-12 25 views
6

Vì vậy, tôi hiện có như sau:Swift Alamofire SwiftyJSON Asynchronous/Synchronous Phương Lớp

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. 
} 


} 

Về cơ bản tôi muốn để có thể gọi println ("Trước Call") sau đó nhận được phản hồi từ loginPassword () và sau đó println ("After Call"). Điều này là tôi tin rằng đồng bộ nhưng tôi không thể tìm ra một cách để làm cho nó hoạt động và toàn bộ các chủ đề đã làm cho đầu tôi bối rối.

tôi về cơ bản muốn để có thể nói:

if i.loginPassword(){ // do some login stuff }else{ // do some error stuff } 

Bất kỳ sự giúp đỡ hoặc gợi ý đánh giá cao.

Trả lời

8

Bạn cần đặt chức năng gọi lại để gọi bất cứ khi nào bạn muốn bên trong chức năng loginPassword().

Đây có thể là một cách để đạt được nó:

func loginPassword(callback: ((isOk: Bool)->Void)?) -> 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) 

     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) 
     } 
    } 
} 

và sau đó ...

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 
     } 

    } 
} 

CẬP NHẬT

Ngoài ra, chức năng gọi điện thoại của bạn có thể trông như thế này:

override func viewDidLoad() { 
    super.viewDidLoad() 

    var identity = Identity(username: "John Apleseed", apiKey: "213123123") 
    identity.loginPassword(handlePasswordRequest) 
} 

và bạn có thể thêm bao nhiêu xử lý gọi lại như bạn có thể cần mà không rối tung xung quanh với một loạt các đóng cửa lồng nhau ...

private func handlePasswordRequest(isOK: Bool){ 
    if (isOK) { 
     //do good stuff here 
    }else{ 
     // do error handling here 
    } 
} 

UPDATE 2

Nếu bạn đang cần để gọi một callback sâu vào hệ thống phân cấp của các cuộc gọi, sau đó bạn sẽ cần phải vượt qua gọi lại như một tham số của mỗi lần đóng trước đó.

CẬP NHẬT 3

tôi sẽ cung cấp cho một cố gắng để RxAlamofire và tất cả về RxSwift

+0

Brilliant cảm ơn! Có cách nào để kết nối điều này với nhau bằng lời hứa để nó không trông khá khó chịu với việc lồng ghép không? Điều này có khả năng có thể nhận được 4-5 cấp độ sâu trong nửa kia của ứng dụng? –

+0

Tôi sẽ cập nhật câu trả lời của mình để chỉ cho bạn một cách khác ... –

+0

Bạn có biết câu trả lời ban đầu trông như thế nào trong Swift 2 không? Nó làm việc cho tôi trong nhanh chóng 1.2 nhưng bây giờ các thông số lỗi dường như được gỡ bỏ. [Ở đây] (http://stackoverflow.com/questions/32277680/alamofire-post-request-with-swift-2) là câu hỏi của tôi về điều này – mattgabor

Các vấn đề liên quan