将类保存在 PCL 中的 NSUserDefaults/UserDefaults 中,并在 Xamarin.iOS/Dr



我已经实现了一个登录服务,并在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();
    }
}

相关内容

最新更新