我已经实现了一个登录服务,并在ViewModel中获取了一些与用户相关的数据作为类。
现在我想将这个类保存在某个地方,并希望稍后访问它。在iOS中,最好的地方是NSUserDefaults。但我必须在Xamarin中做到这一点。我在我的应用程序中使用 MVVMCross,并且已经实现了 PCL。
如前所述,SettingsPlugin将完全按照您的要求进行操作,并且使用起来非常简单。虽然,我过去一直只是进行自己的设置并使用 iOS NSUserDefaults
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();
}
}
对于安卓:
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();
}
}