【问题标题】:Where to initialize PCL instanced in a Xamarin.iOS app?在哪里初始化 Xamarin.iOS 应用程序中的 PCL 实例?
【发布时间】:2016-05-01 00:47:29
【问题描述】:

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

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

我的问题:在 Xamarin.iOS 中,初始化任何相关 PCL 代码的最佳做法是什么?

现在我把它放在RootViewController里面ViewDidLoad()

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

这是正确的位置吗?我曾考虑将它放在 RootViewController 的 ctor 中,但在初始化代码中发生了相当多的事情,因此违反了“不要将重型初始化代码放入构造函数”。

发生的事情是:

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

另外,我认为它可能应该进入AppDelegate 部分,但这听起来不对。

虽然我已经为 Windows 编写 C# 本机代码多年,但总的来说,我对移动应用程序开发和特定的 Xamarin 仍然相当陌生。我只是想确保我遵循最佳实践,但在这种情况下似乎没有“你应该”。

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

【问题讨论】:

    标签: c# ios xamarin xamarin.ios


    【解决方案1】:

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

    【讨论】:

    • 优秀。我可以看到我必须至少深入了解阅读 Swift 和 Obj-C 的基础知识。来自 C#,我天真地希望我能坚持使用 Xamarin 文档的小岛。不是这样。您链接的文档解释了应用程序启动的一些细节,正是我想要的。
    • 在 Xamarin 中,didFinishLaunchingWithOptions() 方法是 FinishedLaunching() - 文档还不够深入。
    • 你让我走上了正轨,它就像一个魅力!我将编辑我的问题并将解决方案放入单独的答案中,但您仍会获得已接受的答案功劳!
    【解决方案2】:

    使用@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 外观之间。

    【讨论】:

    • 这里需要注意的是,如果 FinishedLaunching 在 7 秒或更短的时间内没有返回,iOS 会自动终止该进程。因此,如果您有任何长时间运行的 init 进程,则必须在后台线程上运行它们并允许主 UI 线程从该方法返回。
    猜你喜欢
    • 1970-01-01
    • 2018-07-07
    • 2019-04-10
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 2012-11-23
    相关资源
    最近更新 更多