Asynchronous JSON request in Swift





.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ height:90px;width:728px;box-sizing:border-box;
}







0















I would like to randomize an outlet with randomized questions from a received JSON. Therefore I have to "load" it asynchronously.



************Question edited************************



Why is the Array not "filled"? Also the .count = 0.



@IBAction func refreshBtnTapped(_ sender: UIBarButtonItem) {

let queue = DispatchQueue(label: "Json loading", qos: .userInteractive)

self.btnOutlet.isEnabled = false

func jsonDataRequest () {
let url = "https://redaktion.pflegonaut.de/service.php"
let urlObj = URL(string: url)
URLSession.shared.dataTask(with: urlObj!) { (data, response, error) in
do {

// Json to Array
self.questionsJsonVar = try JSONDecoder().decode([Question].self, from: data!)
let countOfQuestions = self.questionsJsonVar.count
print(self.questionsJsonVar)

// MARK:-- later in queue
DispatchQueue.main.async {

print("main.async")

// -- Randomize Question Outlet
print("Anzahl der Fragen" , self.countOfQuestions)
// PROBLEM prints "Anzahl der Fragen 0"
let randNumber = Int.random(in: 1 ... self.countOfQuestions)
// PROBLEM therefore upperbound < lowerbound
print(self.questionsJsonVar[0].Frage)
// PROBLEM not filled
self.questionTextOutlet.text = self.questionsJsonVar[self.randNumber].Frage
// PROBLEM does not work
}

} catch {
print(error)
}
}.resume()
}

//MARK:-- first in queue
queue.async {
jsonDataRequest()
}

}


Debug Area:



 [R***.Question(ID: "1", Frage: "1", Antwort1: "2", Antwort2: "3", Antwort3: "4", Antwort4: "5", Correct: "1", Notiz: Optional("  1234"), LernsektorID: "0", LerneinheitID: "1", LernbereichID: "1", SchwierigkeitID: "1"),
R***.Question (ID: "51", Frage: " Welche der drei genannten Werte steuert den Atemantrieb?", Antwort1: "pO2", Antwort2: "pCO2", Antwort3: "pH", Antwort4: "K+", Correct: "2", Notiz: Optional(" Gesteuert wird die Atmung im wesentlichen durch das Gehirn beziehungsweise das Atemzentrum in der Medulla oblongata. Ausschlaggebend ist dabei die Reaktion von Chemorezeptoren auf den Kohlendioxid-Gehalt..."),
...
...]
main.async
Anzahl der Fragen 0









share|improve this question































    0















    I would like to randomize an outlet with randomized questions from a received JSON. Therefore I have to "load" it asynchronously.



    ************Question edited************************



    Why is the Array not "filled"? Also the .count = 0.



    @IBAction func refreshBtnTapped(_ sender: UIBarButtonItem) {

    let queue = DispatchQueue(label: "Json loading", qos: .userInteractive)

    self.btnOutlet.isEnabled = false

    func jsonDataRequest () {
    let url = "https://redaktion.pflegonaut.de/service.php"
    let urlObj = URL(string: url)
    URLSession.shared.dataTask(with: urlObj!) { (data, response, error) in
    do {

    // Json to Array
    self.questionsJsonVar = try JSONDecoder().decode([Question].self, from: data!)
    let countOfQuestions = self.questionsJsonVar.count
    print(self.questionsJsonVar)

    // MARK:-- later in queue
    DispatchQueue.main.async {

    print("main.async")

    // -- Randomize Question Outlet
    print("Anzahl der Fragen" , self.countOfQuestions)
    // PROBLEM prints "Anzahl der Fragen 0"
    let randNumber = Int.random(in: 1 ... self.countOfQuestions)
    // PROBLEM therefore upperbound < lowerbound
    print(self.questionsJsonVar[0].Frage)
    // PROBLEM not filled
    self.questionTextOutlet.text = self.questionsJsonVar[self.randNumber].Frage
    // PROBLEM does not work
    }

    } catch {
    print(error)
    }
    }.resume()
    }

    //MARK:-- first in queue
    queue.async {
    jsonDataRequest()
    }

    }


    Debug Area:



     [R***.Question(ID: "1", Frage: "1", Antwort1: "2", Antwort2: "3", Antwort3: "4", Antwort4: "5", Correct: "1", Notiz: Optional("  1234"), LernsektorID: "0", LerneinheitID: "1", LernbereichID: "1", SchwierigkeitID: "1"),
    R***.Question (ID: "51", Frage: " Welche der drei genannten Werte steuert den Atemantrieb?", Antwort1: "pO2", Antwort2: "pCO2", Antwort3: "pH", Antwort4: "K+", Correct: "2", Notiz: Optional(" Gesteuert wird die Atmung im wesentlichen durch das Gehirn beziehungsweise das Atemzentrum in der Medulla oblongata. Ausschlaggebend ist dabei die Reaktion von Chemorezeptoren auf den Kohlendioxid-Gehalt..."),
    ...
    ...]
    main.async
    Anzahl der Fragen 0









    share|improve this question



























      0












      0








      0








      I would like to randomize an outlet with randomized questions from a received JSON. Therefore I have to "load" it asynchronously.



      ************Question edited************************



      Why is the Array not "filled"? Also the .count = 0.



      @IBAction func refreshBtnTapped(_ sender: UIBarButtonItem) {

      let queue = DispatchQueue(label: "Json loading", qos: .userInteractive)

      self.btnOutlet.isEnabled = false

      func jsonDataRequest () {
      let url = "https://redaktion.pflegonaut.de/service.php"
      let urlObj = URL(string: url)
      URLSession.shared.dataTask(with: urlObj!) { (data, response, error) in
      do {

      // Json to Array
      self.questionsJsonVar = try JSONDecoder().decode([Question].self, from: data!)
      let countOfQuestions = self.questionsJsonVar.count
      print(self.questionsJsonVar)

      // MARK:-- later in queue
      DispatchQueue.main.async {

      print("main.async")

      // -- Randomize Question Outlet
      print("Anzahl der Fragen" , self.countOfQuestions)
      // PROBLEM prints "Anzahl der Fragen 0"
      let randNumber = Int.random(in: 1 ... self.countOfQuestions)
      // PROBLEM therefore upperbound < lowerbound
      print(self.questionsJsonVar[0].Frage)
      // PROBLEM not filled
      self.questionTextOutlet.text = self.questionsJsonVar[self.randNumber].Frage
      // PROBLEM does not work
      }

      } catch {
      print(error)
      }
      }.resume()
      }

      //MARK:-- first in queue
      queue.async {
      jsonDataRequest()
      }

      }


      Debug Area:



       [R***.Question(ID: "1", Frage: "1", Antwort1: "2", Antwort2: "3", Antwort3: "4", Antwort4: "5", Correct: "1", Notiz: Optional("  1234"), LernsektorID: "0", LerneinheitID: "1", LernbereichID: "1", SchwierigkeitID: "1"),
      R***.Question (ID: "51", Frage: " Welche der drei genannten Werte steuert den Atemantrieb?", Antwort1: "pO2", Antwort2: "pCO2", Antwort3: "pH", Antwort4: "K+", Correct: "2", Notiz: Optional(" Gesteuert wird die Atmung im wesentlichen durch das Gehirn beziehungsweise das Atemzentrum in der Medulla oblongata. Ausschlaggebend ist dabei die Reaktion von Chemorezeptoren auf den Kohlendioxid-Gehalt..."),
      ...
      ...]
      main.async
      Anzahl der Fragen 0









      share|improve this question
















      I would like to randomize an outlet with randomized questions from a received JSON. Therefore I have to "load" it asynchronously.



      ************Question edited************************



      Why is the Array not "filled"? Also the .count = 0.



      @IBAction func refreshBtnTapped(_ sender: UIBarButtonItem) {

      let queue = DispatchQueue(label: "Json loading", qos: .userInteractive)

      self.btnOutlet.isEnabled = false

      func jsonDataRequest () {
      let url = "https://redaktion.pflegonaut.de/service.php"
      let urlObj = URL(string: url)
      URLSession.shared.dataTask(with: urlObj!) { (data, response, error) in
      do {

      // Json to Array
      self.questionsJsonVar = try JSONDecoder().decode([Question].self, from: data!)
      let countOfQuestions = self.questionsJsonVar.count
      print(self.questionsJsonVar)

      // MARK:-- later in queue
      DispatchQueue.main.async {

      print("main.async")

      // -- Randomize Question Outlet
      print("Anzahl der Fragen" , self.countOfQuestions)
      // PROBLEM prints "Anzahl der Fragen 0"
      let randNumber = Int.random(in: 1 ... self.countOfQuestions)
      // PROBLEM therefore upperbound < lowerbound
      print(self.questionsJsonVar[0].Frage)
      // PROBLEM not filled
      self.questionTextOutlet.text = self.questionsJsonVar[self.randNumber].Frage
      // PROBLEM does not work
      }

      } catch {
      print(error)
      }
      }.resume()
      }

      //MARK:-- first in queue
      queue.async {
      jsonDataRequest()
      }

      }


      Debug Area:



       [R***.Question(ID: "1", Frage: "1", Antwort1: "2", Antwort2: "3", Antwort3: "4", Antwort4: "5", Correct: "1", Notiz: Optional("  1234"), LernsektorID: "0", LerneinheitID: "1", LernbereichID: "1", SchwierigkeitID: "1"),
      R***.Question (ID: "51", Frage: " Welche der drei genannten Werte steuert den Atemantrieb?", Antwort1: "pO2", Antwort2: "pCO2", Antwort3: "pH", Antwort4: "K+", Correct: "2", Notiz: Optional(" Gesteuert wird die Atmung im wesentlichen durch das Gehirn beziehungsweise das Atemzentrum in der Medulla oblongata. Ausschlaggebend ist dabei die Reaktion von Chemorezeptoren auf den Kohlendioxid-Gehalt..."),
      ...
      ...]
      main.async
      Anzahl der Fragen 0






      json swift asynchronous queue priority-queue






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Jan 3 at 23:15







      Pflegonaut

















      asked Jan 3 at 16:30









      PflegonautPflegonaut

      103




      103
























          1 Answer
          1






          active

          oldest

          votes


















          1














          The reason is because the dataTask is asynchronous itself.



          If you want to execute the print("main.async") after the request has returned you need to add the snippet at the end of the response handler. Something like this:



          func jsonDataRequest () {
          let url = "https://redaktion.pflegonaut.de/service.php"
          let urlObj = URL(string: url)
          URLSession.shared.dataTask(with: urlObj!) { (data, response, error) in
          do {

          // Json to Array
          self.questionsJsonVar = try JSONDecoder().decode([Question].self, from: data!)
          let countOfQuestions = self.questionsJsonVar.count
          print(self.questionsJsonVar)

          // Logic after response has arrived
          DispatchQueue.main.async {
          print("main.async")
          }
          } catch {
          print(error)
          }
          }.resume()
          )





          share|improve this answer
























          • works! Thanks. I wanted to update the UI on Dispatch.Queue.main.async (change Label.text to a randomized Json property), but that is not working. "Index out of range". Therefore I think the Array is not "filled".

            – Pflegonaut
            Jan 3 at 22:51













          • the var questionJsonVar: [Question] = was declared in the superclass QuizVC: UIViewController

            – Pflegonaut
            Jan 3 at 22:59











          • solved. It was just a little self.

            – Pflegonaut
            Jan 3 at 23:22












          Your Answer






          StackExchange.ifUsing("editor", function () {
          StackExchange.using("externalEditor", function () {
          StackExchange.using("snippets", function () {
          StackExchange.snippets.init();
          });
          });
          }, "code-snippets");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "1"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54026245%2fasynchronous-json-request-in-swift%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes









          1














          The reason is because the dataTask is asynchronous itself.



          If you want to execute the print("main.async") after the request has returned you need to add the snippet at the end of the response handler. Something like this:



          func jsonDataRequest () {
          let url = "https://redaktion.pflegonaut.de/service.php"
          let urlObj = URL(string: url)
          URLSession.shared.dataTask(with: urlObj!) { (data, response, error) in
          do {

          // Json to Array
          self.questionsJsonVar = try JSONDecoder().decode([Question].self, from: data!)
          let countOfQuestions = self.questionsJsonVar.count
          print(self.questionsJsonVar)

          // Logic after response has arrived
          DispatchQueue.main.async {
          print("main.async")
          }
          } catch {
          print(error)
          }
          }.resume()
          )





          share|improve this answer
























          • works! Thanks. I wanted to update the UI on Dispatch.Queue.main.async (change Label.text to a randomized Json property), but that is not working. "Index out of range". Therefore I think the Array is not "filled".

            – Pflegonaut
            Jan 3 at 22:51













          • the var questionJsonVar: [Question] = was declared in the superclass QuizVC: UIViewController

            – Pflegonaut
            Jan 3 at 22:59











          • solved. It was just a little self.

            – Pflegonaut
            Jan 3 at 23:22
















          1














          The reason is because the dataTask is asynchronous itself.



          If you want to execute the print("main.async") after the request has returned you need to add the snippet at the end of the response handler. Something like this:



          func jsonDataRequest () {
          let url = "https://redaktion.pflegonaut.de/service.php"
          let urlObj = URL(string: url)
          URLSession.shared.dataTask(with: urlObj!) { (data, response, error) in
          do {

          // Json to Array
          self.questionsJsonVar = try JSONDecoder().decode([Question].self, from: data!)
          let countOfQuestions = self.questionsJsonVar.count
          print(self.questionsJsonVar)

          // Logic after response has arrived
          DispatchQueue.main.async {
          print("main.async")
          }
          } catch {
          print(error)
          }
          }.resume()
          )





          share|improve this answer
























          • works! Thanks. I wanted to update the UI on Dispatch.Queue.main.async (change Label.text to a randomized Json property), but that is not working. "Index out of range". Therefore I think the Array is not "filled".

            – Pflegonaut
            Jan 3 at 22:51













          • the var questionJsonVar: [Question] = was declared in the superclass QuizVC: UIViewController

            – Pflegonaut
            Jan 3 at 22:59











          • solved. It was just a little self.

            – Pflegonaut
            Jan 3 at 23:22














          1












          1








          1







          The reason is because the dataTask is asynchronous itself.



          If you want to execute the print("main.async") after the request has returned you need to add the snippet at the end of the response handler. Something like this:



          func jsonDataRequest () {
          let url = "https://redaktion.pflegonaut.de/service.php"
          let urlObj = URL(string: url)
          URLSession.shared.dataTask(with: urlObj!) { (data, response, error) in
          do {

          // Json to Array
          self.questionsJsonVar = try JSONDecoder().decode([Question].self, from: data!)
          let countOfQuestions = self.questionsJsonVar.count
          print(self.questionsJsonVar)

          // Logic after response has arrived
          DispatchQueue.main.async {
          print("main.async")
          }
          } catch {
          print(error)
          }
          }.resume()
          )





          share|improve this answer













          The reason is because the dataTask is asynchronous itself.



          If you want to execute the print("main.async") after the request has returned you need to add the snippet at the end of the response handler. Something like this:



          func jsonDataRequest () {
          let url = "https://redaktion.pflegonaut.de/service.php"
          let urlObj = URL(string: url)
          URLSession.shared.dataTask(with: urlObj!) { (data, response, error) in
          do {

          // Json to Array
          self.questionsJsonVar = try JSONDecoder().decode([Question].self, from: data!)
          let countOfQuestions = self.questionsJsonVar.count
          print(self.questionsJsonVar)

          // Logic after response has arrived
          DispatchQueue.main.async {
          print("main.async")
          }
          } catch {
          print(error)
          }
          }.resume()
          )






          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Jan 3 at 16:39









          gkivanovgkivanov

          16411




          16411













          • works! Thanks. I wanted to update the UI on Dispatch.Queue.main.async (change Label.text to a randomized Json property), but that is not working. "Index out of range". Therefore I think the Array is not "filled".

            – Pflegonaut
            Jan 3 at 22:51













          • the var questionJsonVar: [Question] = was declared in the superclass QuizVC: UIViewController

            – Pflegonaut
            Jan 3 at 22:59











          • solved. It was just a little self.

            – Pflegonaut
            Jan 3 at 23:22



















          • works! Thanks. I wanted to update the UI on Dispatch.Queue.main.async (change Label.text to a randomized Json property), but that is not working. "Index out of range". Therefore I think the Array is not "filled".

            – Pflegonaut
            Jan 3 at 22:51













          • the var questionJsonVar: [Question] = was declared in the superclass QuizVC: UIViewController

            – Pflegonaut
            Jan 3 at 22:59











          • solved. It was just a little self.

            – Pflegonaut
            Jan 3 at 23:22

















          works! Thanks. I wanted to update the UI on Dispatch.Queue.main.async (change Label.text to a randomized Json property), but that is not working. "Index out of range". Therefore I think the Array is not "filled".

          – Pflegonaut
          Jan 3 at 22:51







          works! Thanks. I wanted to update the UI on Dispatch.Queue.main.async (change Label.text to a randomized Json property), but that is not working. "Index out of range". Therefore I think the Array is not "filled".

          – Pflegonaut
          Jan 3 at 22:51















          the var questionJsonVar: [Question] = was declared in the superclass QuizVC: UIViewController

          – Pflegonaut
          Jan 3 at 22:59





          the var questionJsonVar: [Question] = was declared in the superclass QuizVC: UIViewController

          – Pflegonaut
          Jan 3 at 22:59













          solved. It was just a little self.

          – Pflegonaut
          Jan 3 at 23:22





          solved. It was just a little self.

          – Pflegonaut
          Jan 3 at 23:22




















          draft saved

          draft discarded




















































          Thanks for contributing an answer to Stack Overflow!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54026245%2fasynchronous-json-request-in-swift%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          MongoDB - Not Authorized To Execute Command

          in spring boot 2.1 many test slices are not allowed anymore due to multiple @BootstrapWith

          How to fix TextFormField cause rebuild widget in Flutter