Как Codable вписывается в процесс восстановления iOS? - PullRequest
0 голосов
/ 25 октября 2018

В AppDelegate.swift У меня есть:

func application(_ application: UIApplication, shouldRestoreApplicationState coder: NSCoder) -> Bool {
    return true
}

И iOS будет вызывать мои методы класса encodeRestorableState() & decodeRestorableState() во время восстановления состояния.

Как Codable работает суважение к государственному восстановлению?Как называется iOS и как мне связать свои структуры и классы Codable?

1 Ответ

0 голосов
/ 25 октября 2018

encodeRestorableState (с :) передает вам экземпляр NSCoder.Любые переменные, которые вам требуются для восстановления вашего состояния, должны быть закодированы здесь с использованием encode (_: forKey :) с этим кодером и поэтому должны соответствовать Codable.

decodeRestorableState (с :) передает вам этот же кодер в тело функции.Вы можете получить доступ к свойствам в декодере с помощью ключа, который вы использовали, когда они были закодированы, а затем установить их для переменных экземпляра или иным образом использовать их для настройки вашего контроллера.

например

import UIKit

struct RestorationModel: Codable {
   static let codingKey = "restorationModel"
   var someStringINeed: String?
   var someFlagINeed: Bool?
   var someCustomThingINeed: CustomThing?
}

struct CustomThing: Codable {
   let someOtherStringINeed = "another string"
}

class ViewController: UIViewController {
   var someStringIDoNotNeed: String?
   var someStringINeed: String?
   var someFlagINeed: Bool?
   var someCustomThingINeed: CustomThing?

   override func encodeRestorableState(with coder: NSCoder) {
      super.encodeRestorableState(with: coder)
      let restorationModel = RestorationModel(someStringINeed: someStringINeed,
                                              someFlagINeed: someFlagINeed,
                                              someCustomThingINeed: someCustomThingINeed)

      coder.encode(restorationModel, forKey: RestorationModel.codingKey)
   }

   override func decodeRestorableState(with coder: NSCoder) {
      super.decodeRestorableState(with: coder)
      guard let restorationModel = coder.decodeObject(forKey: RestorationModel.codingKey) as? RestorationModel else {
         return
      }
      someStringINeed = restorationModel.someStringINeed
      someFlagINeed = restorationModel.someFlagINeed
      someCustomThingINeed = restorationModel.someCustomThingINeed
   }
}
...