Zaimplementowałem usługę logowania i pobrałem dane związane z użytkownikiem jako klasę w ViewModel.
Teraz chcę gdzieś zapisać tę klasę i chcęaby uzyskać do niego dostęp później. W iOS najlepszym miejscem do tego byłoby NSUserDefaults. Ale muszę to zrobić w Xamarinie. Używam MVVMCross w mojej aplikacji i mam zaimplementowany PCL.
Odpowiedzi:
0 dla odpowiedzi № 1Jak wspomniano UstawieniaPlugin zrobi dokładnie to, co chcesz i jest bardzo prosty w użyciu. Chociaż zawsze tworzyłem własne ustawienia i korzystałem z nich NSUserDefaults
dla iOS w przeszłości z Newtonsoft.Json
.
public class iOSSettings : ISettings
{
public ViewModel CurrentViewModel
{
get { return DeserializeSetting<ViewModel>("CurrentViewModel"); }
set { SerializeSetting("CurrentViewModel", value); }
}
private static T DeserializeSetting<T>(string key)
where T : class
{
string json = NSUserDefaults.StandardUserDefaults.StringForKey(key);
if (string.IsNullOrEmpty(json))
return null;
return JsonConvert.DeserializeObject<T>(json);
}
private static void SerializeSetting(string key, object value)
{
if (value == null)
{
NSUserDefaults.StandardUserDefaults.SetString(string.Empty, key);
}
else
{
NSUserDefaults.StandardUserDefaults.SetString(JsonConvert.SerializeObject(value), key);
}
}
public void Save()
{
NSUserDefaults.StandardUserDefaults.Synchronize();
}
}
Dla Android:
public class AndroidSettings : ISettings
{
private readonly Context _context;
private ISharedPreferences _preferences;
private ISharedPreferencesEditor _editor;
public AndroidSettings(Context context)
{
_context = context;
}
public ViewModel CurrentViewModel
{
get { return GetObject<ViewModel>("CurrentViewModel"); }
set { Put("CurrentViewModel", value); }
}
public void Save()
{
//Commit changes and dispose
if (_editor != null)
{
_editor.Commit();
_editor.Dispose();
_editor = null;
}
if (_preferences != null)
{
_preferences.Dispose();
_preferences = null;
}
}
private T GetObject<T>(string key)
where T : class
{
//Use a local instance of preferences for "Get"
using (var preferences = PreferenceManager.GetDefaultSharedPreferences(_context))
{
string json = preferences.GetString(key, string.Empty);
if (string.IsNullOrEmpty(json))
return null;
return JsonConvert.DeserializeObject<T>(json);
}
}
private void Put(string key, object value)
{
CheckPreferences();
_editor.PutString(key, JsonConvert.SerializeObject(value));
_editor.Commit();
}
private void CheckPreferences()
{
//Create preferences & editor if needed
if (_preferences == null)
_preferences = PreferenceManager.GetDefaultSharedPreferences(_context);
if (_editor == null)
_editor = _preferences.Edit();
}
}