/ / Zapisz klasę w NSUserDefaults / UserDefaults w PCL i używaj jej w Xamarin.iOS / Droid - xamarin, xamarin.ios, mvvmcross

Zapisz klasę w NSUserDefaults / UserDefaults w PCL i użyj jej w Xamarin.iOS / Droid - xamarin, xamarin.ios, mvvmcross

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 № 1

Jak 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();
}
}