2016-07-10 1 views
-3

Я сделал некоторый код, чтобы сделать запрос POST на мой php-скрипт, который размещен на моих серверах. Я тестировал и эта часть работает нормально. У меня возникла проблема с возвращаемым результатом с сервера - я получаю его в формате JSON и печатаю внутри оператора do-catch - его ОК. Я назначаю возвращаемую переменную переменной, которая объявлена ​​вне do-catch и ее не «видима». Позвольте мне показать мой код, он будет более проще объяснить, когда вы видите код:scope do-catch в swift - не может присваивать значение внешней переменной

//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

Элвин - Как мне назвать функцию, для меня что-то новое? –

ответ

0

Вы используете асинхронный блок. Оператор печати будет запущен до того, как ваш блок сможет установить нови.

Эта проблема не является проблемой при наводке, это асинхронная проблема.

Смежные вопросы