Json auslesen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Mac & i Test Abo
  • MCDan schrieb:

    Valevale schrieb:

    In der Funktions funktioniert es, aber ich hätte gerne Zugriff auf das Array außerhalb der Funktion. Das geht leider immer noch nicht :(
    Warum möchtest Du unbedingt ausserhalb des Completion Blocks auf das Array zugreifen, wenn dieses noch nicht geladen wurde? ?(
    Macht doch eigentlich keinen Sinn, auf Daten zuzugreifen, die noch nicht geladen wurden, oder?
    Vermutlich weil er die asynchrone Programmierung noch nicht verstanden hat.
  • Valevale schrieb:

    Und wie bekomme ich das Array das Array dann da raus mit oder ohne dispatchQueue
    Kombiniere einfach die Beiträge 14 und 15 in diesem Thread:

    C-Quellcode

    1. override func viewDidLoad() {
    2. super.viewDidLoad()
    3. // MARK:- JSON
    4. // JSON-----------------------------------------------------------------
    5. let url = "https://redaktion.pflegonaut.de/service.php"
    6. let urlObj = URL(string: url)
    7. func jsonDataRequest () {
    8. URLSession.shared.dataTask(with: urlObj!) { (data, response, error) in
    9. do {
    10. // Json to Array
    11. self.questionsJsonVar = try JSONDecoder().decode([Question].self, from: data!)
    12. // prints data correctly
    13. self.countOfQuestions = self.questionsJsonVar.count
    14. print("Array:", self.questionsJsonVar)
    15. // -- Randomize Question Outlet ToDo
    16. let randNumber = Int.random(in: 1 ... self.countOfQuestions - 1)
    17. print(self.questionsJsonVar[number].Frage)
    18. DispatchQueue.main.async {
    19. self.questionTextOutlet.text = self.questionsJsonVar[self.randNumber].Frage
    20. }
    21. } catch {
    22. print(error)
    23. }
    24. }.resume()
    25. }
    26. // JSON---------------------------------------------------------------
    27. // MARK:-- OutletConnection
    28. jsonDataRequest()
    29. }
    Alles anzeigen
  • Valevale schrieb:

    Dann hat sich aber das Problem noch nicht geloest oder? Und wie bekomme ich das Array das Array dann da raus mit oder ohne dispatchQueue :) Habe gesehen, dass jemand folgendes gemacht hat:

    Macht das Sinn, eine eigene Klasse mit einem weiteren Array zu erstellen, um da das sowieso schon bestehende JsonArray zu speichern? Auf jeden Fall scheint man hier Zugriff zu haben.

    Quellcode

    1. import UIKit
    2. class Actors: Codable {
    3. let actors: [Actor]
    4. init(actors: [Actor]) {
    5. self.actors = actors
    6. }
    7. }
    8. class Actor: Codable {
    9. let name: String
    10. let description: String
    11. let dob: String
    12. let country: String
    13. let height: String
    14. let spouse: String
    15. let children: String
    16. let image: String
    17. init(name: String, description: String, dob: String, country: String, height: String, spouse: String, children: String, image: String) {
    18. self.name = name
    19. self.description = description
    20. self.dob = dob
    21. self.country = country
    22. self.height = height
    23. self.spouse = spouse
    24. self.children = children
    25. self.image = image
    26. }
    27. }
    Alles anzeigen

    Brainfuck-Quellcode

    1. import UIKit
    2. class ViewController: UIViewController, UITableViewDataSource {
    3. final let url = URL(string: "http://microblogging.wingnity.com/JSONParsingTutorial/jsonActors")
    4. //--------------------------------
    5. private var actors = [Actor]()
    6. //--------------------------------
    7. @IBOutlet var tableView: UITableView!
    8. override func viewDidLoad() {
    9. super.viewDidLoad()
    10. downloadJson()
    11. tableView.tableFooterView = UIView()
    12. }
    13. func downloadJson() {
    14. guard let downloadURL = url else { return }
    15. URLSession.shared.dataTask(with: downloadURL) { data, urlResponse, error in
    16. guard let data = data, error == nil, urlResponse != nil else {
    17. print("something is wrong")
    18. return
    19. }
    20. print("downloaded")
    21. do
    22. {
    23. let decoder = JSONDecoder()
    24. let downloadedActors = try decoder.decode(Actors.self, from: data)
    25. self.actors = downloadedActors.actors
    26. DispatchQueue.main.async {
    27. self.tableView.reloadData()
    28. }
    29. } catch {
    30. print("something wrong after downloaded")
    31. }
    32. }.resume()
    33. }
    Alles anzeigen
    Das hat der jemand nur so gemacht (mit dem Array von Actors) weil das JSON ihm das vermutlich so vorgibt. Das hat mit deinem problem nichts zu tun.

    Ließ dich am betsen mal in Objektorientierung (Instanzvariablen) und asynchrone Programmierung ein, ichd enke dann merkst du warum das so, wie du willst, nicht geht.
    Man kann alles schaffen. Man muss es nur wollen ;)
    www.regetskcob.github.io
  • matz schrieb:

    MCDan schrieb:

    Valevale schrieb:

    In der Funktions funktioniert es, aber ich hätte gerne Zugriff auf das Array außerhalb der Funktion. Das geht leider immer noch nicht :(
    Warum möchtest Du unbedingt ausserhalb des Completion Blocks auf das Array zugreifen, wenn dieses noch nicht geladen wurde? ?( Macht doch eigentlich keinen Sinn, auf Daten zuzugreifen, die noch nicht geladen wurden, oder?
    Vermutlich weil er die asynchrone Programmierung noch nicht verstanden hat.
    Vielen Dank für die netten Hilfestellungen! :) Manchmal weiß man gar nicht, was man alles nicht weiß.

    Ich habe mich inzwischen ein wenig in asynchrone Programierung eingelesen und werde versuchen queues nach prioritäten zu definieren ;) Evtl. frage ich nochmal nach, wenn ich nicht weiter komme.

    Eine letzte Frage habe ich noch, um nicht weiter in die falsche Richtung zu laufen.
    Ursprünglich war der Plan sogar die Sachen vom empfangenen Json direkt in Core Data zu speichern, damit die App ohne Internetverbindung funktionieren kann.
    Ich habe gesehen es gibt verschiedene Varianten (Frameworks etc.).

    Was würdet Ihr mit mir empfehlen? Habt Ihr ein Tipp für eine Lernbasis (Tutorials auf Youtube o.Ä., Udemy Kurse) für das Thema?

    Vielen Dank im Voraus!
  • Valevale schrieb:

    Was würdet Ihr mit mir empfehlen? Habt Ihr ein Tipp für eine Lernbasis (Tutorials auf Youtube o.Ä., Udemy Kurse) für das Thema?
    Mit CoreData hast du dir nicht gerade das leichteste Einstiegsthema gesucht ...

    Lektüre:

    - developer.apple.com/library/ar…ptual/CoreData/index.html
    - raywenderlich.com/7569-getting…d-with-core-data-tutorial

    Alternative:

    - realm.io/docs/swift/latest