2016-05-10 9 views
0

Durch Antippen einer Schaltfläche in ViewController1 wird die Anwendung an ViewController2 weitergeleitet.CPU-intensiven Code ausführen, ohne UIViewController-Segment zu verzögern? Wie führe ich Code * nur einmal und nachher aus * hat sich der UIViewController selbst vorgestellt?

Das Tippen auf die Schaltfläche löst auch eine leicht CPU-intensive Operation aus. (d. h. Zusammenfügen mehrerer Bilder und Schreiben des Ergebnisses auf die Platte). Dieser Vorgang kann erst eingeleitet werden, wenn die Schaltfläche angetippt wird.

Der Nebeneffekt ist eine schlechte Benutzererfahrung. Die ViewController1-Schaltfläche bleibt einen Tick länger hervorgehoben und das Segment wird merklich verzögert.

Das Verschieben des intensiven Codes in ViewController2's viewDidLoad Funktion scheint nicht hilfreich, da es eine Verzögerung erzeugt, aber auf der ViewController2-Seite nicht ViewController1.

Das Verschieben des Codes in ViewController2 viewDidAppear scheint auch unerwünscht, da dieser Vorgang nur einmal ausgelöst werden sollte, nicht jedes Mal ViewController2 angezeigt wird. Das Hinzufügen einer Variablen, nur um zu verfolgen, ob die Operation ausgelöst wurde, scheint suboptimal zu sein.

Eine weitere Option ist, den Code in ViewController2's viewDidLoad zu setzen, aber eine leichte Verzögerung mit dispatch_after einzuführen, um sicherzustellen, dass der Code das Segment nicht beeinträchtigt.

Was ist der richtige Ansatz, um dieses Muster zu behandeln?

Gibt es eine andere UIViewController-Funktion, die für diesen Zweck verwendet werden sollte (d. H., Code wird nur einmal ausgeführt, und erst nachdem der UIViewController sich dem Benutzer präsentiert hat)?

Antwort

1

Auf einem hohen Niveau, hier ist ein Gedanke:

  1. eine Singleton-Klasse, dass Ihr „Ergebnis“ als Eigenschaft hat. Wenn der View Controller 2 danach fragt, kann der Singleton ihn (das Ergebnis) erstellen, wenn er nicht bereits existiert (wenn es existiert, nun, Sie sind bereits fertig).

  2. Drücken Sie diesen lang laufenden Job in eine Operationswarteschlange und lassen Sie die Operation eine Stellvertreternachricht (oder eine Benachrichtigung, was auch immer Ihr Boot schwimmt) zurück zum Controller 2, wenn es fertig ist. Wenn VC2 diese Nachricht erhält, kann sie "aktualisieren".

  3. Abhängig davon, wie lange dieser Job dauert, möchten Sie vielleicht eine Spinner- und/oder Lademeldung auf VC2 einfügen und dann während der "Aktualisierung" wieder loswerden.

(I erwähnte Operation Warteschlange, vor allem, weil ich sie mag. Es kann wie, was Mechanismus Sie sein, der Punkt ist, dass die Arbeit nicht auf dem Haupt-Thread ausgeführt wird.)