2016-07-10 57 views
-3

我已經提出了一些代碼來向我的php腳本發出POST請求,這些腳本放置在我的服務器上。我已經測試過,那部分工作正常。我從服務器返回結果時遇到了問題 - 我以JSON格式獲取它,並在內部do-catch語句中打印 - 它正常。我將返回變量賦值給在do-catch之外聲明並且不是「visible」的變量。讓我告訴我的代碼,這將是更simplier解釋,當你看到代碼:swift中的do-catch的範圍 - 無法爲外部變量賦值

//sending inputs to server and receiving info from server 
    let json:[String:AnyObject] = [ "username" : username!, "password" : password!, "iphone" : "1" ] 
    var link = "http://www.pnc.hr/rfid/login.php" 
    var novi:String = "" 

     do { 
      let jsonData = try NSJSONSerialization.dataWithJSONObject(json, options: .PrettyPrinted) 

      // create post request 
      let url = NSURL(string: link)! 
      let request = NSMutableURLRequest(URL: url) 
      request.HTTPMethod = "POST" 

      // insert json data to the request 
      request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type") 
      request.HTTPBody = jsonData 

      request.addValue("application/json", forHTTPHeaderField: "Content-Type") 
      request.addValue("application/json", forHTTPHeaderField: "Accept") 


      let task = NSURLSession.sharedSession().dataTaskWithRequest(request){ data, response, error in 
       if error != nil{ 
        print("Error 55 -> \(error)") 
        return 
       } 

       do { 
        let result = try NSJSONSerialization.JSONObjectWithData(data!, options: []) as? [String:AnyObject] 
        print("FIRST PRINT -> \(result!["password"])") 
        novi = String(result!["password"]) 
        //return result 
       } catch { 
        print("Error 43-> \(error)") 
       } 
      } 
      task.resume() 
     } 
     catch { 
      //handle error. Probably return or mark function as throws 
      print(error) 

     } 

    print("SECOND PRINT -> \(novi)") 

如果你看到print("FIRST PRINT -> \(result!["password"])") - 其正常執行和輸出所有的變量。然後,如果您在代碼末尾看到print("SECOND PRINT -> \(novi)"),它會輸出空的刺痛 - 就像我沒有爲其分配變量一樣。

+2

這是「dataTaskWithRequest異步執行」問題的另一種變體,與do-catch無關。 –

+0

我剛剛修改了你的答案。請看看這段代碼。 http://www.wepaste.com/Alvin%20Varghese/ –

+0

Alvin - 我如何調用函數,完成對我而言是新事物 –

回答

0

您正在使用異步塊。打印語句將在您的塊有機會設置novi之前運行。

這個問題不是do-catch的問題,它是一個異步問題。