Objektorientiertes Problem

Hallihallöle,

ich fange gerade ein wenig mit iOS Apps an und scheitere an einem Fehler in meinen Überlegungen zur Objektorientierten Programmierung. Ich poste es hier und nicht in einem AppleForum, weil es mehr um die Theorie geht und ich diese Community in allen Belangen für kompetenter halte :slight_smile:

Also ich habe eine xml-Datei mit 365 Zitaten drin und der User kann dann via Navigation dort durchzappen und sich Zitate anzeigen lassen.
Es existieren drei für das Problem relevante Klassen.
Der ViewController steuert die Anzeige, ist bei iOS-Apps vorgeben und kommt so ein wenig der main-Methode gleich.
Im ViewController lege ich ein Objekt der Klasse QuoteManager an. Hier werden alle Zitate verwaltet. Und in der Klasse QuoteManager existiert dann ein Objekt der Klasse XMLParser, welcher Methoden zum Einlesen der Zitate aus der XML-Datei besitzt.
Nun speichere ich beim Schließen der App stets eine Variable 0 bis 364 ab, welches Zitat der Nutzer bei Schließen offen hatte.

Beim Aufrufen der App lädt er dann folgenden Ablauf:
[ul]
[li]Lege QuoteManager an, lege XMLParser an und parse die Zitate.
[/li][li]Lies die Variable ein, die gespeichert wurde.
[/li][li]Öffne die Bedienoberfläche mit dem aktuellen Zitat.
[/li][/ul]

Nun mein Objektorientieres Problem: Der Parser ist nicht schnelll genug, sodass der Punkt, wo ich die Bedienoberfläche mit der Zitatnummer lade eine OutOfBoundsException wirft, da das spezifische Zitat noch nicht geladen ist.

D.h. der dritte Punkt der Liste wird gemacht, während der erste noch im Hintergrund läuft.
Daher kann ich das nicht sofort in der Main-Methode mit integrieren.

Der XML-Parser jedoch hat eine Methode die mir auswirft, wann er fertig ist, und da kann ich dann in der Theorie Prima den Befehl zum Laden der Bedienoberfläche reinstecken.
Hier ist jedoch das Problem. Wenn der ViewController den QuoteManager erstellt und dieser den XMLParser erstellt, dann habe ich doch im XMLParser gar keinen Zugriff auf die ViewController-Klasse.

Meine Frage ist dahingehend, wie ihr das durch Einsatz von Objekten und Beziehungen zwischen den Klassen lösen würdet.

Danke und Schöne Grüße
Lukas :slight_smile:

für sowas gibt es immer lifecycles: dein XMLParser soll und darf eigentlich nichts von der UI wissen…

viewDidLoad

The viewDidLoad event is only called when the view is created and loaded into memory. But the bounds for the view are not defined yet.** This is a good place to initialize the objects** that the view controller is going to use.

Looking to understand the iOS UIViewController lifecycle - Stack Overflow

Hallo,

danke für Deine Antwort.
Dass der nichts davon wissen darf, ist mir bewusst, daher ja auch das Problem. Ich danke vielmals für den interessanten Link. Ich muss mich generell mehr mit derartigen Livecycles befassen.
Gelöst habe ich das Problem nun doch eher zufällig auf einer interessanten Seite zu Threads in Swift: https://thatthinginswift.com/background-threads/
Hiermit hat das funktioniert:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
	// do some task
	dispatch_async(dispatch_get_main_queue(), ^{
		// update some UI
	});
});

Schöne Grüße
Lukas