2016-07-10 12 views
-3

自分のサーバーに置かれているPHPスクリプトにPOSTリクエストを行うためのコードをいくつか作成しました。私はテストして、その部分は正常に動作しています。サーバーから返された結果に問題があります。JSON形式で取得し、内部のdo-catchステートメントで印刷します。OKです。私は戻ってくる変数をdo-catchの外で宣言されたvariableに代入し、その変数は「可視」ではありません。あなたがコードを見たときに説明するより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を設定する機会を得る前に、printステートメントが実行されます。

この問題はdo-catchの問題ではありませんが、非同期の問題です。

関連する問題