在Xamarin.iOS应用程序中初始化PCL实例的位置?

问题描述:

我正在研究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的建议提取了解决方案。

对于iOS,Appdelegate方法是初始化代码的最佳位置。 appdelegate还提供了多个委托方法,可以为您提供有关应用程序生命周期事件的反馈,例如方法“DidFinishLauchingWithOptions” 。如果你有很多数据需要下载,或者你的应用依赖于长时间运行的任务,我建议你看看backgrounding for iOS。 我也用过的技术是我的IOS上的第一个视图控制器(或Android上的活动)显示启动画面和加载指示器,同时我运行一些代码来刷新缓存。

+0

非常好。我可以看到,我不得不进一步深入阅读Swift和Obj-C的基础知识。来自C#我天真地希望我能坚持到Xamarin文档的小岛。并非如此。您链接的文档解释了应用程序启动的一些细节,正是我所期待的。 – Marakai

+0

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

+0

你让我走在正确的轨道上,它像一个魅力!我会编辑我的问题,并将解决方案放入单独的答案中,但您仍然可以获得接受的答案。 – Marakai

使用@神灯精灵的指针,该解决方案的工作就像一个魅力:

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