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

时间:2016-05-01 00:47:29

标签: c# ios xamarin xamarin.ios

我正在开发一个Xamarin应用程序,我最初会在iOS上工作,但计划稍后扩展到Android和其他移动平台。

因此,我试图在PCL中保留尽可能多的通用代码。

我的问题:现在最好的做法是什么 - 在Xamarin.iOS中 - 初始化任何依赖的PCL代码?

现在,我已将RootViewController置于ViewDidLoad()

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

这是正确的位置吗?我考虑将它放在RootViewController的ctor中,但是在初始化代码中有一点点,因此反对“不要将重型init代码放入构造函数中”。

发生的事情是:

  • 加载应用设置
  • 如果应用是第一次运行,请加载基本默认值
  • 初始化其他PCL库,例如TextToSpeech模块,状态引擎(因此上面的类的名称)等
  • 根据XML或JSON输入准备数据网格

或者,我可能会进入AppDelegate部分,但听起来不对。

我对移动应用程序开发人员以及特定的Xamarin仍然相当新,尽管我已经为Windows做了多年的C#本机代码。我只想确保遵循最佳做法,但在这种情况下似乎没有“你应该”。

编辑:我根据@ wishmaster的建议提取了解决方案。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

使用@ 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-CSwift中这些示例的类似方法,您可以通过指向AppDelegate的属性访问信息。

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

结果导致应用程序启动速度更快,因为初始化现在在启动屏幕期间发生,而不再处于启动画面和UI外观之间。