Получение UserDefaults ничего не возвращает - PullRequest
4 голосов
/ 10 июля 2020

У меня проблема с UserDefaults. Я использую UserDefaults(suiteName: UserDefaults.Keys.groupKey), потому что у меня также есть Share Extension. Это моя настройка:

добавочный номер UserDefaults:

func setDataSourceArray(data: [Wishlist]?){
    set(try? PropertyListEncoder().encode(data), forKey: Keys.dataSourceKey)
    synchronize()
}

func getDataSourceArray() -> [Wishlist]? {
    if let data = self.value(forKey: Keys.dataSourceKey) as? Data {
        if let dataSourceArray =
            try? PropertyListDecoder().decode(Array < Wishlist > .self, from: data) as[Wishlist] {
                return dataSourceArray
            }
    }
    return nil
}

Набор вызовов:

 // save dataSourceArray in UserDefaults
if let defaults = UserDefaults(suiteName: UserDefaults.Keys.groupKey) {
    defaults.setIsLoggedIn(value: true)
    defaults.setDataSourceArray(data: dataArray as? [Wishlist])
    defaults.setDropOptions(dropOptions: self.dropOptions)
    defaults.synchronize()
} else {
    print("error Main")
}

Setting работает отлично. Ошибки нет.

Вызов get:

if let defaults = UserDefaults(suiteName: UserDefaults.Keys.groupKey) {
        print(defaults.isLoggedIn())
        if defaults.isLoggedIn(){
            if let data = defaults.getDataSourceArray(){
                
                defaults.synchronize()
                print(data[0].name)

            } else {
                print("Error getting dataSourceArray")
            }
        } else {
            print("yeet")
        }
        
    } else {
        print("error 1")
}

Всегда выводится: «Ошибка при получении dataSourceArray». Я застрял и понятия не имею, что я делаю здесь не так, поэтому я рад любой помощи!

ОБНОВЛЕНИЕ:

Я заметил странную поведение, которое я не могу объяснить: когда в Calling set я вызываю только defaults.setDataSourceArray(data: dataArray as? [Wishlist]) без настройки isLoggedIn и dropOptions, он работает нормально ?! Кто-нибудь может мне это объяснить?

Ответы [ 2 ]

2 голосов
/ 14 июля 2020

Решил проблему .. Тупая проблема новичков. Когда setDropOptions внутри UserDefaults, я использовал key из dataSourceArray. Исправлено и теперь работает. Спасибо всем, кто все равно пытался помочь :)

0 голосов
/ 10 июля 2020

Ваш набор равен нулю

 defaults.setDataSourceArray(data: dataArray as? [Wishlist]) 

, так как dataArray as? [Wishlist] не даст nil

func getDataSourceArray() -> [Wishlist]? {
    if let data = self.value(forKey: Keys.dataSourceKey) as? Data {  
            do {  
                  let dataSourceArray =  try PropertyListDecoder().decode(Array < Wishlist > .self, from: data) as[Wishlist] 
                  return dataSourceArray
            }
            catch { 
               print(error) 
            }
    } 
    return nil
}
    
    
...