我正在开发一个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代码放入构造函数中”。
发生的事情是:
或者,我可能会进入AppDelegate
部分,但听起来不对。
我对移动应用程序开发人员以及特定的Xamarin仍然相当新,尽管我已经为Windows做了多年的C#本机代码。我只想确保遵循最佳做法,但在这种情况下似乎没有“你应该”。
编辑:我根据@ wishmaster的建议提取了解决方案。
答案 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-C或Swift中这些示例的类似方法,您可以通过指向AppDelegate的属性访问信息。
var myappdelegate = UIApplication.SharedApplication.Delegate as AppDelegate;
var engine = myappdelegate.Engine;
View = new MainView(engine);
结果导致应用程序启动速度更快,因为初始化现在在启动屏幕期间发生,而不再处于启动画面和UI外观之间。