NSURLSession正确获取数据,但在Task.resume()之后不返回任何内容

时间:2016-01-05 19:59:42

标签: ios swift httprequest nsurlsession

我正在尝试连接我的HTTP服务器以获取JSON格式的数据。它可以正确连接和获取数据。我能够在task.resume()之前打印数据,但是在task.resume()之后它不会打印。此外,该函数返回空对象。

我尝试在task.resume()之前将其保存到全局变量中。所以,我可以使用getter方法来获取数据,但仍然返回空。

你能告诉我这里做错了吗?提前致谢

func getTicketInfo(rDate: String, rName: String) -> NSDictionary {

    var obj = NSDictionary()
    let request = NSMutableURLRequest(URL: NSURL(string: self.host)!)
    request.HTTPMethod = "POST"
    let postString = "&DriverName=\(self.username);&Password=\(self.password);&Function=getTicketPrintInvoiceInfo;&routeName=\(rName);&routeDate=\(rDate);";
    request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
    let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
        data, response, error in

        if error != nil {
            print("error=\(error)", terminator: "")
            return
        }

        var parseError: NSError?
        let parsedObject: AnyObject?
        do {
            parsedObject = try NSJSONSerialization.JSONObjectWithData(data!,
                options: NSJSONReadingOptions.AllowFragments)
        } catch let error as NSError {
            parseError = error
            parsedObject = nil
        } catch {
            fatalError()
        }

        obj = (parsedObject as? NSDictionary)!

        //prints the object fine
        print(obj)


    }

    task.resume()
    //prints empty result
    print(obj)
    return obj;


}

2 个答案:

答案 0 :(得分:0)

因为这是async请求。你在块之外执行的那行代码还没有得到任何结果。所以,你什么都看不到。如果您正在尝试调试它。执行顺序如下:

task.resume()
//prints empty result
print(obj)
return obj;

然后,下一次执行将是print(obj)内部。当然,如果网络不好,它会有点慢。

答案 1 :(得分:0)

首次打印后出现此代码(obj)

 DispatchQueue.main.async {
    UserDefaults.standard.setValue("\(obj)", forKey: "objGlobal")
 }

这会将obj记录到UserDefauls。当你需要它时,你可以从那里抓住它。