2016-05-01 3 views
1

Ich arbeite an einer Xamarin-Anwendung, die ich zunächst auf iOS arbeiten werde, aber später auf Android und andere mobile Plattformen erweitern möchte.Wo initialisiert man PCL in einer Xamarin.iOS App?

Als solche versuche ich, so viel gemeinsamen Code in PCLs wie möglich zu halten.

Meine Frage: Was ist die beste Vorgehensweise - in Xamarin.iOS für jetzt - um jeden abhängigen PCL-Code zu initialisieren?

Denn jetzt habe ich es in der RootViewController innen ViewDidLoad()

public override void ViewDidLoad() 
{ 
    base.ViewDidLoad(); 
    _engine = new MyEngine(); 
    View = new MainView(_engine); 
} 

Ist dies die richtige Stelle? Ich hatte darüber nachgedacht, es in den ctor für die RootViewController zu setzen, aber es gibt ein gutes Stückchen in dem Initialisierungscode, der damit gegen "nicht schweren Init-Code in einen Konstruktor" lief.

Dinge, die geschehen sind:

  • laden App-Einstellungen
  • Wenn App für das erste Mal ausgeführt wird, laden Grund defaults
  • Initialise andere PCL-Bibliotheken, wie ein TextToSpeech Modul, ein Zustand, Motor (daher der Name der Klasse, oben), usw.
  • einem Datenraster auf XML basiert vorbereiten oder JSON Eingangs

Al ternately, ich sollte es vielleicht in die AppDelegate Sektion gehen, aber das klang nicht richtig.

Ich bin immer noch ziemlich neu in der mobilen App dev im Allgemeinen und Xamarin in bestimmten, obwohl ich C# nativen Code für Windows seit Jahren getan habe. Ich möchte nur sicherstellen, dass ich den Best Practices folge, aber in diesem Fall scheint es kein "Du sollst" zu geben.

Edit: Ich habe die Lösung basierend auf @ wishmaster Vorschläge extrahiert.

Antwort

1

Für iOS ist die Appdelegate-Methode der beste Ort für den Initialisierungscode. Das AppDelegate bietet auch mehrere Delegate-Methoden, um Ihnen Feedback zu Anwendungslebenszyklusereignissen zu geben, z. B. die Methode "DidFinishLauchingWithOptions" . Wenn Sie viele Daten zum Herunterladen oder lang laufende Aufgaben haben, auf die Ihre App angewiesen ist, sollten Sie einen Blick auf backgrounding for iOS werfen. Eine Technik, die ich auch verwendet habe, ist für meinen ersten Viewcontroller auf IOS (oder Aktivität auf Android), um einen Begrüßungsbildschirm und eine Ladeanzeige anzuzeigen, während ich etwas Code ausführen, um den Cache zu aktualisieren.

+0

Ausgezeichnet. Ich kann sehen, dass ich mehr in die Grundlagen von Swift und Obj-C eintauchen muss. Von C# kommend, hatte ich naiv gehofft, ich könnte bei der kleinen Insel von Xamarin Dokumentation bleiben. Nicht so. Das Dokument, das Sie verlinkt haben, erklärt einige der Feinheiten der App-Einführung, genau das, wonach ich gesucht habe. – Marakai

+0

In Xamarin ist die Methode didFinishLaunchingWithOptions() FinishedLaunching() - und die Dokumente sind bei weitem nicht so detailliert. – Marakai

+0

Sie haben mich auf dem richtigen Weg und es funktioniert wie ein Charme! Ich bearbeite meine Frage und lege die Lösung in eine separate Antwort, aber Sie erhalten immer noch die Akzeptierte Antwort-Gutschrift! – Marakai

0

Mit @ Wishmaster der Zeiger funktioniert diese Lösung wie ein Zauber:

In AppDelegate.cs

// in the global section put any data you may make available elsewhere 
private var _engine; 
public Engine => _engine; 

public override bool FinishedLaunching(UIApplication app, NSDictionary options) 
{ 
    /* 
    * Do whatever init needs to happen here, if you need to make this 
    * available elsewhere, ensure you have properties or accessors, 
    * as above. 
    */ 
    _engine = new MyEngine(); 
    return true; 
} 

Dann in RootViewController.cs auf diese Beispiele einen ähnlichen Ansatz in Obc-C oder Swift Sie die Informationen über einen Zugriff auf Eigenschaft, die auf AppDelegate zeigt.

var myappdelegate = UIApplication.SharedApplication.Delegate as AppDelegate; 
var engine = myappdelegate.Engine; 
View = new MainView(engine); 

Das Ergebnis ergab sich ein flotter aus der Anwendung starten, weil die Initialisierung jetzt während der Begrüßungsbildschirm passiert, und nicht mehr zwischen Splash-Screen und das Aussehen der Benutzeroberfläche.

+1

Eine Sache, die hier zu beachten ist, ist, dass iOS den Prozess automatisch beendet, wenn der FinishedLaunch nicht innerhalb von 7 Sekunden oder weniger zurückkehrt. Wenn Sie lange Initprozesse haben, müssen Sie diese in einem Hintergrundthread ausführen und zulassen, dass der Hauptthread der Benutzeroberfläche von dieser Methode zurückkehrt. – pnavk

Verwandte Themen