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;
}
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
add a comment |
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
add a comment |
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
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
json swift asynchronous queue priority-queue
edited Jan 3 at 23:15
Pflegonaut
asked Jan 3 at 16:30
PflegonautPflegonaut
103
103
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
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()
)
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
add a comment |
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
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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()
)
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
add a comment |
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()
)
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
add a comment |
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()
)
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()
)
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
add a comment |
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
add a comment |
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.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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