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