2016-01-05 125 views
1

我試圖連接我的HTTP服務器獲取JSON格式的數據。它連接並正確獲取數據。我能夠在task.resume()之前打印數據,但它不會在task.resume()之後打印此外,該函數還會返回空對象。NSURLSession正確獲取數據,但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; 


} 
+0

你不能等待異步方法返回結果,否則這將是一個同步的方法。添加完成處理程序以更新您的UI –

+1

print(obj)在task.resume()後立即調用。它不會等待它完成。如果你有//打印對象,那麼你需要處理結果。 –

+0

這個函數不是用來更新UI的,但我想我需要讓它在task.resume()之前更新我需要用數據更新的類。所以,因爲它會返回空,所以這個類沒有一個返回類型的權利,對吧? – pininfarina

回答

0

因爲這是async請求。你在塊外執行的代碼行還沒有得到任何結果。所以,你什麼都看不到。如果你正在嘗試調試它。執行順序將是這樣的:

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

然後,接下來的執行將是print(obj)內。當然,如果網絡不好,它會慢一點。

+0

好的。似乎函數不會等待任務完成,並在填充之前返回obj。但是,爲什麼將它保存到全局變量不起作用?我將它保存到task.resume()之前的全局變量中然後,我嘗試使用另一個類的getter函數訪問它,但返回空。此外,任何使它成爲「同步」請求的方式? – pininfarina

0

添加該代碼首先打印(OBJ)

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

後便會記錄obj轉換爲UserDefauls。當你需要它時,你可以從那裏抓住它。