[英]Where to initialize PCL instanced in a Xamarin.iOS app?
我正在開發一個 Xamarin 應用程序,我首先將在 iOS 上工作,但計划稍后擴展到 Android 和其他移動平台。
因此,我試圖在 PCL 中保留盡可能多的通用代碼。
我的問題:什么是最佳實踐 - 現在在 Xamarin.iOS 中 - 初始化任何依賴的 PCL 代碼?
現在我在ViewDidLoad()
的RootViewController
有它
public override void ViewDidLoad()
{
base.ViewDidLoad();
_engine = new MyEngine();
View = new MainView(_engine);
}
這是正確的地方嗎? 我曾考慮將它放在RootViewController
的構造函數中,但是在初始化代碼中發生了相當多的事情,因此與“不要將重型初始化代碼放入構造函數中”相悖。
發生的事情是:
或者,我認為它應該進入AppDelegate
部分,但這聽起來不對。
盡管我已經為 Windows 編寫了 C# 本機代碼多年,但我對移動應用程序開發和 Xamarin 總體上還是相當陌生。 我只是想確保我遵循最佳實踐,但在這種情況下似乎沒有“你應該”。
編輯:我已經根據@wishmaster 的建議提取了解決方案。
對於 iOS,Appdelegate 方法是初始化代碼的最佳位置。 appdelegate 還提供了多個委托方法來為您提供有關應用程序生命周期事件的反饋,例如方法“ DidFinishLauchingWithOptions ”。 如果您有大量數據要下載或您的應用程序依賴的長時間運行任務,我建議您查看iOS 的背景。 我還使用過的一項技術是讓我在 IOS(或 Android 上的活動)上的第一個視圖控制器在我運行一些代碼以刷新緩存時顯示啟動畫面和加載指示器。
使用@wishmaster 的指針,這個解決方案就像一個魅力:
在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-C或Swift 中的這些示例類似的方法,您可以通過指向 AppDelegate 的屬性訪問信息。
var myappdelegate = UIApplication.SharedApplication.Delegate as AppDelegate;
var engine = myappdelegate.Engine;
View = new MainView(engine);
結果導致應用程序更快速地啟動,因為初始化現在發生在啟動畫面期間,而不再發生在啟動畫面和 UI 外觀之間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.