在Xamarin.iOS应用程序中初始化PCL实例的位置?
我正在研究Xamarin应用程序,我将首先在iOS上工作,但计划稍后扩展到Android和其他移动平台。在Xamarin.iOS应用程序中初始化PCL实例的位置?
因此,我试图尽可能多地在PCL中保留通用代码。
我的问题:现在最好的做法 - 在Xamarin.iOS中 - 初始化任何从属PCL代码?
现在我把它在里面RootViewController
ViewDidLoad()
public override void ViewDidLoad()
{
base.ViewDidLoad();
_engine = new MyEngine();
View = new MainView(_engine);
}
这是正确的位置?我曾考虑将它放在RootViewController
的ctor中,但是在初始化代码中有一点点,因此它违背了“不要将重型init代码放入构造函数中”。
发生的事情是:
- 加载应用程序设置
- 如果应用程序是运行第一次,负荷基本默认
- 初始化其他PCL库,如文字转语音模块,状态引擎(因此类的名称以上)等
- 准备基于XML或JSON输入数据网格
铝在我看来,虽然它可能会进入AppDelegate
部分,但这听起来不对。
对于移动应用程序开发人员和特定的Xamarin来说,我还是比较新的,尽管我已经为Windows做了多年的C#本机代码。我只是想确保我遵循最佳做法,但在这种情况下似乎并没有什么“必然”。
编辑:我已经根据@ wishmaster的建议提取了解决方案。
对于iOS,Appdelegate方法是初始化代码的最佳位置。 appdelegate还提供了多个委托方法,可以为您提供有关应用程序生命周期事件的反馈,例如方法“DidFinishLauchingWithOptions” 。如果你有很多数据需要下载,或者你的应用依赖于长时间运行的任务,我建议你看看backgrounding for iOS。 我也用过的技术是我的IOS上的第一个视图控制器(或Android上的活动)显示启动画面和加载指示器,同时我运行一些代码来刷新缓存。
使用@神灯精灵的指针,该解决方案的工作就像一个魅力:
在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);
结果导致了迅捷的启动应用程序,因为初始化现在闪屏时,闪屏和用户界面的外观之间发生,不再。
这里需要注意的一点是,如果FinishedLaunching在7秒或更短的时间内没有返回,iOS会自动终止进程。因此,如果您有任何长时间运行的init进程,则必须在后台线程上运行这些进程,并允许主UI线程从该方法返回。 – pnavk
非常好。我可以看到,我不得不进一步深入阅读Swift和Obj-C的基础知识。来自C#我天真地希望我能坚持到Xamarin文档的小岛。并非如此。您链接的文档解释了应用程序启动的一些细节,正是我所期待的。 – Marakai
在Xamarin中,didFinishLaunchingWithOptions()方法是FinishedLaunching() - 而且文档并不深入。 – Marakai
你让我走在正确的轨道上,它像一个魅力!我会编辑我的问题,并将解决方案放入单独的答案中,但您仍然可以获得接受的答案。 – Marakai