在PCL中的NSUserDefaults / UserDefaults中保存类并在Xamarin.iOS / Droid中使用它

时间:2018-01-17 17:04:18

标签: xamarin xamarin.ios mvvmcross

我已经实现了一个登录服务,并在ViewModel中将一些用户相关数据作为一个类。

现在我想在某个地方保存这个类,并希望以后再访问它。在iOS中,最好的地方就是NSUserDefaults。但我必须在Xamarin中这样做。我在我的应用程序中使用MVVMCross并实现了PCL。

1 个答案:

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