我有一个带有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文件中,我是这样访问它的:
 let appDelegate = UIApplication.shared.delegate as! AppDelegate

但是,在函数networkResponseHandler中,当我使用断点时,我看到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"]);
}

最佳答案

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

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

在这段代码中,您启动了一个异步请求,这意味着您的打印代码是在接收到要打印的数据之前执行的。
您需要在收到答案后实现您的代码,以便实现您需要在任务中添加一个委托并实现NSURLSessionTaskDelegate中的正确方法。

关于ios - 在Swift中退出后,在函数中更改类变量无效,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40219492/

10-11 17:22