在视图之间传递数据的最佳方法是什么?

时间:2014-03-20 18:21:10

标签: c# ios design-patterns xamarin multiplatform

我做了一些研究,仍然没有找到一种似乎正确的解决方案,采用“最佳实践”的方式。

我正在使用Xamarin开发适用于iPhone的App。这个应用程序将只是初始iPhone,但有计划在不久的将来为Android和Windows Phone制作版本。

这个App克里特/保存了一个“时刻”。这一刻有一些图片加上一些信息。基本上,这个时刻将在整个App中使用,随着来自大量视图的更多数据而增加。 虽然我确实将这个时刻保存到某种存储库(SQL,文件系统,......,我仍然必须实现它),但我需要它通过工作流来活着。

这样做的一种方法是:

var moment = new Moment()
// .. add infos from view to moment
nextView.Moment = moment;
PerformSegue(...);

这是正确的做法吗?没有任何模式可以用来从所有平台解决它并更好地控制如何在视图之间传递此信息(样本会受到赞赏)?

7 个答案:

答案 0 :(得分:4)

您可能已经看到,即使苹果使用单例模式访问当前应用程序实例以打开URL只是一个示例

UIApplication.SharedApplication.OpenUrl(urlToSend)

因此,在您的情况下,Singleton是正确的选择,请确保您没有将所有内容放在此处,因为性能达到了

所以当你没有其他办法时,请使用单身。

以下是制作单例类

的示例线程安全代码
using System;  
namespace MySingletonPattern  
{  
   sealed class Singleton  
   {  
      //To make the thread safe access we need an instance
      private static readonly object _lockObj = new object();  

      //Lazy initialisation for the real instance
      private static volatile Singleton _instance;  

      private Singleton()  
      {  
      }  

      static internal Singleton Instance()  
      {  
         if (_instance == null)  
         {  
            //To make the access Thread safe
            lock(_lockObj)  
            {  
               if(_instance == null)  
               {  
    //Creating the instance of singleton class and this will be re-used 
                  _instance = new Singleton();  
               }    
            }  
         }  
         return _instance;  
      }  
   }  
}  

以下是如何使用它

Singleton obj1 = Singleton.Instance();

答案 1 :(得分:3)

您可以使用Singleton模式在应用的每个位置访问您的数据。

查看Wiki页面(带样本): http://en.wikipedia.org/wiki/Singleton_pattern

答案 2 :(得分:2)

我通常将数据作为参数传递给视图的构造函数,然后在视图中保留对它的引用作为局部变量。

但是,如果您在整个应用程序中使用相同的数据,那么最好使用Singleton,或者只使用静态类。

答案 3 :(得分:0)

如果您创建单身人士,则可以在应用中的任何位置访问它。使用静态方法在ios中创建单例:

+ (Moment *)sharedInstance {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedObject = [[self alloc] init];
    });

    return sharedObject;
}

答案 4 :(得分:0)

你是对的,单身人士似乎是最好的选择。

对于将来的参考,我的单身人士课程:

public sealed class CurrentMoment
{
    private static CurrentMoment s_instance;
    //private Moment m_moment;
    private CurrentMoment()
    {
    }

    public static CurrentMoment Instance
    {
        get
        {
            if (s_instance == null)
                s_instance = new CurrentMoment();

            return s_instance; 
        }
    }

    /// <summary>
    /// Gets or sets the moment.
    /// </summary>
    /// <value>The moment.</value>
    public Moment Moment
    {
        get;
        set;
    }
}

答案 5 :(得分:0)

  

我没有任何模式可以用来从所有平台上解决它并更好地控制如何在视图之间传递此信息(样本会受到赞赏)?

我不确定您的工作流程是什么。它是否可以在一个平台内成为原子?也就是说,如果用户Fred拥有Android平板电脑和iPhone,他不打算在一个平台上创建Moment并在另一个平台上完成工作流程?

如果是这样,请将其存储在模型中(应用程序中独立于iOS,Windows Mobile,Android平台的部分)。如果您的视图随不同平台而变化,这是基本的模型 - 视图分离。 CurrentMoment proposed by Giusepe的单身人士对我有意义。

如果工作流程在平台之间不是“可中断的”,那么就不要打扰持久的CurrentMoment。

答案 6 :(得分:0)

您还可以扩展Application类

vtAPIRequest.hash