2016-05-01 36 views
1

我正在研究Xamarin應用程序,我將首先在iOS上工作,但計劃稍後擴展到Android和其他移動平臺。在Xamarin.iOS應用程序中初始化PCL實例的位置?

因此,我試圖儘可能多地在PCL中保留通用代碼。

我的問題:現在最好的做法 - 在Xamarin.iOS中 - 初始化任何從屬PCL代碼?

現在我把它在裏面RootViewControllerViewDidLoad()

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

這是正確的位置?我曾考慮將它放在RootViewController的ctor中,但是在初始化代碼中有一點點,因此它違背了「不要將重型init代碼放入構造函數中」。

發生的事情是:

  • 加載應用程序設置
  • 如果應用程序是運行第一次,負荷基本默認
  • 初始化其他PCL庫,如文字轉語音模塊,狀態引擎(因此類的名稱以上)等
  • 準備基於XML或JSON輸入數據網格

鋁在我看來,雖然它可能會進入AppDelegate部分,但這聽起來不對。

對於移動應用程序開發人員和特定的Xamarin來說,我還是比較新的,儘管我已經爲Windows做了多年的C#本機代碼。我只是想確保我遵循最佳做法,但在這種情況下似乎並沒有什麼「必然」。

編輯:我已經根據@ wishmaster的建議提取了解決方案。

回答

1

對於iOS,Appdelegate方法是初始化代碼的最佳位置。 appdelegate還提供了多個委託方法,可以爲您提供有關應用程序生命週期事件的反饋,例如方法「DidFinishLauchingWithOptions」 。如果你有很多數據需要下載,或者你的應用依賴於長時間運行的任務,我建議你看看backgrounding for iOS。 我也用過的技術是我的IOS上的第一個視圖控制器(或Android上的活動)顯示啓動畫面和加載指示器,同時我運行一些代碼來刷新緩存。

+0

非常好。我可以看到,我不得不進一步深入閱讀Swift和Obj-C的基礎知識。來自C#我天真地希望我能堅持到Xamarin文檔的小島。並非如此。您鏈接的文檔解釋了應用程序啓動的一些細節,正是我所期待的。 – Marakai

+0

在Xamarin中,didFinishLaunchingWithOptions()方法是FinishedLaunching() - 而且文檔並不深入。 – Marakai

+0

你讓我走在正確的軌道上,它像一個魅力!我會編輯我的問題,並將解決方案放入單獨的答案中,但您仍然可以獲得接受的答案。 – Marakai

0

使用@神燈精靈的指針,該解決方案的工作就像一個魅力:

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; 
} 

然後在RootViewController.cs使用類似的方法將這些例子Obc-CSwift您可以通過訪問信息指向AppDelegate的屬性。

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

結果導致了迅捷的啓動應用程序,因爲初始化現在閃屏時,閃屏和用戶界面的外觀之間發生,不再。

+1

這裏需要注意的一點是,如果FinishedLaunching在7秒或更短的時間內沒有返回,iOS會自動終止進程。因此,如果您有任何長時間運行的init進程,則必須在後臺線程上運行這些進程,並允許主UI線程從該方法返回。 – pnavk