Как декодировать данные массива, который сохраняется и читается из userDeafults - Swift - PullRequest
1 голос
/ 19 октября 2019

Я работаю над проектом, в котором есть plist, содержащий строки словарей, а затем я помещаю все строки данных в массив и сохраняю его в useDefaults, и все эти вещи кажутся правильными, но впрочитав метод, я понимаю, что мои данные, похоже, закодированы и показывают это в кодах. вот так (6b756e74) Интересно узнать, как я могу правильно декодировать свои данные. вот мои коды

struct Country : Codable {
    let orFlagEmoji, destFlagEmoji : String

    private enum CointryKeys : String, CodingKey { case orFlagEmoji, destFlagEmoji }
}

var countries = [Country]()

  override func viewDidLoad() {
    super.viewDidLoad()


    let urlPlist = Bundle.main.url(forResource: "ListinFirstPage", withExtension: "plist")!
    let data = try! Data(contentsOf: urlPlist)


    do
    {
        countries = try PropertyListDecoder().decode([Country].self, from: data)
    }
    catch
    {
        // Handle error
        print(error)
    }
      savePlaces()
      readPlaces()
   }

   func savePlaces(){

    do
    {
        let placesData = try PropertyListEncoder().encode(countries)
        UserDefaults.standard.set(placesData , forKey: "places")

        return
    }
    catch
    {
    print("SaveError")
    }


}

func readPlaces()
{

    let loadedcart = UserDefaults.standard.object(forKey: "places")

    print(loadedcart as Any)

}

Проблема в том, что когда я печатаю loadedcart (что он должен содержать данные стран) в консоли, кажется, что данные были закодированы каким-то образом. вывод - это некоторые числа, а не мои строковые данные. Я действительно ценю, если кто-нибудь поможет мне исправить это. Большое спасибо

1 Ответ

2 голосов
/ 19 октября 2019

Прежде всего удалите readPlaces. Это бессмысленно

func readPlaces()
{   
    let loadedcart = UserDefaults.standard.object(forKey: "places")    
    print(loadedcart as Any)    
}

Удалить также

private enum CointryKeys : String, CodingKey { case orFlagEmoji, destFlagEmoji }

, потому что ключи никогда не используются (даже не правильно написано CountryKeys).


В основном ваш код для загрузки и сохранения данных правильный, он просто неправильно используется.

Проверьте, пуст ли ключ places в UserDefaults. Если это так, скопируйте данные из комплекта

var countries = [Country]()

override func viewDidLoad() {
    super.viewDidLoad()
    do {
       try loadPlaces()
    } catch { print(error) }
}

func loadPlaces() throws 
{
    let data : Data
    if let placesData = UserDefaults.standard.data(forKey: "places") {
       data = placesData
    } else {
       let urlPlist = Bundle.main.url(forResource: "ListinFirstPage", withExtension: "plist")!
       data = try Data(contentsOf: urlPlist)
       UserDefaults.standard.set(data, forKey: "places")
    }
    countries = try PropertyListDecoder().decode([Country].self, from: data) 
}

func savePlaces()
{
    do {
        let placesData = try PropertyListEncoder().encode(countries)
        UserDefaults.standard.set(placesData , forKey: "places")
    } catch {
        print("SaveError", error)
    }
}

. Звоните savePlaces всегда после изменения countries (за исключением viewDidLoad)

Как указано в комментариях UserDefaults неправильное место для сохранения большого набора данных. Предпочтителен пользовательский файл в папке Documents.

...