2016-04-26 7 views
0

私はSwiniftで書かれたSingInServiceを使ってユーザーのログイン情報を取得しています。私はalamofireを使ってHTTP投稿を呼び出しています。私は(dispatch_get_main_queue())dispatch_asyncしようとしたサービスとなってJSON形式のユーザーのログイン情報がSingInServiceにloginedUserに渡すのではなく、不使用を走った後、私は問題を抱えている私はサービスをワープするときにalamofire非同期呼び出し?

要求がある前に、あなたのreturn文が呼び出されている
 var loginedUser = UserModel() 

     @IBAction func signedInAction(sender: AnyObject) { 
      let username:String = txtfUsername.text! 
      let password:String = txtfPassword.text! 



       let singInService = SingInService(); 
       dispatch_async(dispatch_get_main_queue()) { 
       self.loginedUser = singInService.getUserCredential(username, password: password) 
       } 
       print(self.loginedUser._username); 
       txtfUsername.resignFirstResponder() 
       txtfPassword.resignFirstResponder()    
     } 


    class SingInService { 

      func getUserCredential(username:String,password:String)->UserModel 
      { 
       var authenticatedUser = UserModel() 
       let user = username 
       let password = password 

       let credential = NSURLCredential(user: user, password: password, persistence: .ForSession) 

       Alamofire.request(.GET, "https://httpbin.org/basic-auth/\(user)/\(password)") 
        .authenticate(usingCredential: credential) 
        .responseJSON { response in 
         switch response.result { 
         case .Success(let JSON): 

          let responseJson = JSON as! NSDictionary 
          let username:String = responseJson.objectForKey("user")! as! String 
          let authenticated:Bool = responseJson.objectForKey("authenticated")! as! Bool 

          authenticatedUser = UserModel(username: username,password:password,isAuthenticated: authenticated,isManager:false) 

         case .Failure(let error): 
          print(error) 
         } 
       } 
       return authenticatedUser; 
      } 
    } 

答えて

1

サービスであなたのサインがAlamoFire要求が完了したときに実行される閉鎖を取る必要があります。これで今すぐauthenticatedUserが返されます。 AlamoFireのような結果を得るために非同期に実行するものを使用するサービスを作成する場合、サービスでもこれらの結果を非同期に返す必要があることを覚えておく必要があります。

class SingInService { 

    func getUserCredential(username: String, password: String, signInCallback: (userModel: UserModel) -> Void) { 

     // call AlamoFire and in the Success case call the signInCallback 
     // ... 
     authenticatedUser = UserModel(username: username,password:password,isAuthenticated: authenticated,isManager:false) 

     signInCallback(authenticatedUser) 

    } 
} 

あなたはそれを呼び出すときに、サービス機能ではなく、あなたがそれをAlamoFireは結果を取得した後に実行し、結果を提供しますクロージャを与え、直接値を返さないことに注意してください。

あなたはそうのようにそれを使用する:あなたが本当にあなたのサービスが完全にするために、この作業を持っている

singInService.getUserCredential(username, password: password) { (userModel: UserModel) in 

    self.loginedUser = userModel 
    print(self.loginedUser._username) 
} 

たら、必ずあなたのコールバックは関係なく、何が起こるかと呼ばれていない、と一緒に運びますようにしたいでしょう認証されたユーザーだけでなく、可能性のあるエラー情報も含む。

1

終了しました。あなたはより良いあなたにgetUserCredential方法、そのようなこと完了ブロックを渡す必要があります。

func getUserCredential(username:String,password:String, completion:(model: UserModel) -> Void)->Void 
     { 
      var authenticatedUser = UserModel() 
      let user = username 
      let password = password 

      let credential = NSURLCredential(user: user, password: password, persistence: .ForSession) 

      Alamofire.request(.GET, "https://httpbin.org/basic-auth/\(user)/\(password)") 
       .authenticate(usingCredential: credential) 
       .responseJSON { response in 
        switch response.result { 
        case .Success(let JSON): 

         let responseJson = JSON as! NSDictionary 
         let username:String = responseJson.objectForKey("user")! as! String 
         let authenticated:Bool = responseJson.objectForKey("authenticated")! as! Bool 

         authenticatedUser = UserModel(username: username,password:password,isAuthenticated: authenticated,isManager:false) 
         competion(authenticatedUser) 

        case .Failure(let error): 
         print(error) 
        } 
      } 
     } 

をして、それを呼び出す:

singInService.getUserCredential(username, password: password, completion: { (userModel) in 
    self.loginedUser = userModel 
    print(self.loginedUser._username) 
) 
関連する問題