在Swift

时间:2016-10-24 13:16:29

标签: ios iphone swift xcode

我有一个带有NSDictionary类型

变量的Data类
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文件中,我可以像这样访问它:

 let appDelegate = UIApplication.shared.delegate as! AppDelegate

但是,在函数networkResponseHandler中,当我使用断点时,我看到结果具有正确的值,但在函数外部它是空的。

使用Data对象: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"]);
}

1 个答案:

答案 0 :(得分:1)

问题是您正在执行异步请求:

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

在此代码中,您启动了异步请求,这意味着您在接收要打印的数据之前执行了打印代码。

您需要在收到答案后实施代码,以实现您需要向任务添加委托并从NSURLSessionTaskDelegate实施正确的方法。