2016-10-24 63 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中的文件,和IM accesing它是這樣的:

let appDelegate = UIApplication.shared.delegate as! AppDelegate 

但是,在函數networkResponseHandler當我使用斷點時,我看到結果具有適當的值,但在函數之外它是空的。

使用數據對象: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

您沒有發佈使用Data對象的代碼,只是發佈了類本身以及對AppDelegate的引用。你在哪裏創建數據對象?你在哪裏使用networkResponseHandler? –

+0

@MarcoPace我更新了問題 –

+0

感謝您的更新,但仍缺少一些代碼:我可以看到按下按鈕後執行登錄,但我沒有看到你要求「結果」的地方。你可以在你試圖訪問的地方添加代碼嗎? –

回答

1

的問題是,你正在執行一個異步請求:

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

在這段代碼中,你開始一個異步請求,這意味着你的打印代碼在您收到要打印的數據之前執行。

您需要在收到答案後實現您的代碼,以實現您需要向您的任務添加委託並實施NSURLSessionTaskDelegate的正確方法。

+0

我得到了問題。謝謝!我的數據類應該從NSURLSessionTaskDelegate這個實現? –