2016-10-24 14 views
0

に出た後には効果がありません変更クラス変数は、私はNSDictionaryの型の変数を一つのデータクラスを持っているスウィフト

class Data { 

    var user : String; 
    var pass : String; 
    var result: NSDictionary; 


    init(user: String, pass: String) { 
     self.user = user; 
     self.pass = pass; 
     self.result = NSDictionary(); 
    } 


    func networkResponseHandler(data: Foundation.Data?, response:URLResponse?, err:Error?) -> Void { 

     if err != nil { print(err); return; } 

     let jsonResult : NSDictionary = try! JSONSerialization.jsonObject(with: data! as Foundation.Data, options: .allowFragments) as! NSDictionary; 
     //print(jsonResult); 

     print(jsonResult["result"]) 

     self.result = jsonResult.copy() as! NSDictionary; 

    } 

    func login() -> Bool { 
     let url = URL(string: "http://"); 
     let task = URLSession.shared.dataTask(with: url!, completionHandler: networkResponseHandler); 

     task.resume(); 
     return true; 
    } 
} 

このクラスのインスタンスはAppDelegateファイルであり、そしてイムは、このようにそれをaccesing:

let appDelegate = UIApplication.shared.delegate as! AppDelegate 

しかし、関数networkResponseHandlerでは、ブレークポイントを使用すると結果に適切な値が含まれていますが、関数の外は空です。データオブジェクトの

用途:あなたは非同期要求を開始した。このコードでは

appDelegate.uData!.login(); 
print(appDelegate.uData!.result["result"]); 

、それはあなたのことを意味しますViewControler.swift

@IBAction func bSignInPressed(_ sender: AnyObject) { 
    let appDelegate = UIApplication.shared.delegate as! AppDelegate 
    appDelegate.uData = Data(user: tEmail.text!, pass: tPassword.text!); 
    appDelegate.uData!.login(); 

    print(appDelegate.uData!.result["result"]); 
} 
+0

データオブジェクトが使用されているコードを投稿せず、クラス自体とAppDelegateへの参照を送信しました。データオブジェクトはどこで作成しますか?どこでnetworkResponseHandlerを使用しますか? –

+0

@MarcoPace質問を更新しました –

+0

更新していただきありがとうございますが、まだコードがありません:ボタンを押した後にログインを実行することがわかりましたが、「結果」を求める場所は表示されません。アクセスしようとする場所にコードを追加できますか? –

答えて

1

問題はあなたが非同期要求を実行しているということです印刷したいデータを受け取る前に印刷コードが実行されます。

回答を受け取った後にコードを実装する必要があります。これは、タスクに代理人を追加し、NSURLSessionTaskDelegateから正しい方法を実装する必要があることを実現するためです。

+0

私は問題が発生します。ありがとうございました!私のデータクラスは、NSURLSessionTaskDelegateからこの実装を持つ必要がありますか? –

関連する問題