Как лучше всего передавать данные между представлениями?

Я провел некоторое исследование и до сих пор не нашел решения, которое кажется правильным, в соответствии с «лучшими практиками».

Я работаю над приложением для iPhone, используя Xamarin. Это приложение будет доступно только для iPhone, но в ближайшем будущем планируется выпуск версий для Android и Windows Phone.

Это приложение создает/сохраняет «Момент». В этот момент есть несколько фотографий плюс некоторая информация. По сути, этот момент будет использоваться во всем приложении, к которому добавлено больше данных из множества просмотров. Пока я сохраняю этот момент в какой-то репозиторий (SQL, файловая система, ..., мне все еще нужно это реализовать), мне нужно, чтобы он был активен в рабочем процессе.

Один из способов сделать это:

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

Это правильный способ сделать это? Нет никакого шаблона, который я мог бы использовать, чтобы решить его со всех платформ и лучше контролировать, как передавать эту информацию между представлениями (примеры будут оценены)?


person Giusepe    schedule 20.03.2014    source источник


Ответы (7)


Вы можете использовать шаблон Singleton, чтобы получить доступ к вашим данным в каждой точке вашего приложения.

Посетите вики-страницу (с образцом): http://en.wikipedia.org/wiki/Singleton_pattern< /а>

person k.gemmricher    schedule 20.03.2014

Возможно, вы видели, что даже Apple использует шаблон singleton для доступа к текущему экземпляру приложения, чтобы открыть 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();
person Durai Amuthan.H    schedule 27.02.2017
comment
класс MySingletonClass, но в конструкторе упоминается как Singleton - person 90hex; 27.03.2017
comment
Спасибо, я изменил его - person Durai Amuthan.H; 28.03.2017

Обычно я передаю данные в качестве аргумента в конструкторе представления, а затем внутри представления сохраняю ссылку на них как на локальную переменную.

Однако, если вы используете один и тот же фрагмент данных глобально во всем приложении, возможно, лучше использовать синглтон или просто статический класс.

person Jason    schedule 20.03.2014

Если вы создаете синглтон, вы можете получить к нему доступ в любом месте приложения. Создание синглтона в ios с помощью статического метода:

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

    return sharedObject;
}
person Marius Waldal    schedule 20.03.2014

Вы правы, синглтон кажется лучшим выбором.

Для будущих ссылок мой одноэлементный класс:

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;
    }
}
person Giusepe    schedule 20.03.2014

Нет никакого шаблона, который я мог бы использовать, чтобы решить его со всех платформ и лучше контролировать, как передавать эту информацию между представлениями (примеры будут оценены)?

Я не уверен, каков ваш рабочий процесс. Будет ли это атомарным в пределах одной платформы? То есть, если у пользователя Фреда есть планшет на Android и iPhone, он не будет создавать Момент на одной платформе, а завершать рабочий процесс на другой?

Если да, то сохраните его в модели (той части приложения, которая не зависит от платформ iOS, Windows Mobile, Android). Это базовое разделение модели и представления, если ваши представления меняются на разных платформах. Синглтон для CurrentMoment, предложенный Джузепе, имеет для меня смысл.

Если рабочий процесс нельзя прерывать между платформами, не беспокойтесь о постоянном CurrentMoment.

person Fuhrmanator    schedule 21.03.2014

Вы также можете расширить класс приложения

public class HelloApplication : Application 
{
    public static int GlobalVariable = 1;
}
person Shyju M    schedule 09.10.2017