Сохранены данные в файле JSON, но невозможно получить предыдущие данные, только новые записи - PullRequest
0 голосов
/ 07 мая 2020

Я сохраняю данные в файле json на первом V C, также загружаю данные и отображаю их при переключении вкладки. Когда я убиваю приложение или снова запускаю приложение, добавляю новые данные в файл JSON, только эти новые данные находятся в файле JSON, предыдущие данные исчезают (удаляются без удаления их вручную) и не могут быть загружены . Как сохранить файл, чтобы при следующем запуске программы он просто добавлялся к предыдущим данным?

class ViewController: UIViewController {

var game : Game?
var weekLeague : [[Game]]? = []

override func viewDidLoad() {
        super.viewDidLoad()
        creation()
}

@IBAction func endWLButton(_ sender: UIButton) {
        if games != nil {
            weekLeague?.append(games!)
        }

        save()
    }

func save(){
        guard let documentDirectoryUrl = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { return }
        let fileUrl = documentDirectoryUrl.appendingPathComponent("ArrayOfArray.json")
        print(fileUrl)
        let json = try? JSONEncoder().encode(weekLeague)

        do {
            try json?.write(to: fileUrl)
                print(json!)
            print(weekLeague)

             print("JSON data was written to teh file successfully!")
        }catch{
            print(error)
        }
    }

   func ShouldSendGame(game: Game) {
    self.game = game
    games?.append(game)
}

 func creation(){
        let documentsDirectoryPathString = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
        let documentsDirectoryPath = NSURL(string: documentsDirectoryPathString)!

        let jsonFilePath = documentsDirectoryPath.appendingPathComponent("ArrayOfArray.json")
        let fileManager = FileManager.default
        var isDirectory: ObjCBool = false

        // creating a .json file in the Documents folder
        if !fileManager.fileExists(atPath: jsonFilePath!.path, isDirectory: &isDirectory) {
            let created = fileManager.createFile(atPath: jsonFilePath!.path, contents: nil, attributes: nil)
            if created {
                print("File created ")
            } else {
                print("Couldn't create file for some reason")
            }
        } else {
            print("File already exists")
        }
    }


}



class AllLeagueController : UITableViewController {
    var arrayOfArrayGamesCopy : [[Game]] = []

override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
         DispatchQueue.global().async {
            self.loadData()
            DispatchQueue.main.async {
                self.tableView.reloadData()
            }
        }

    }


 func loadData() {
         guard let documentsDirectoryUrl = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { return }
            let fileUrl = documentsDirectoryUrl.appendingPathComponent("ArrayOfArray.json")

              do{
                  let data = try Data(contentsOf:fileUrl)
                  let decoder = JSONDecoder()
                  let jsonData = try decoder.decode([[Game]].self, from: data)
                   arrayOfArrayGamesCopy = jsonData
                    print("Succes")
                print(jsonData.count)
              } catch{
                  print(error)
              }

      }

}

1 Ответ

1 голос
/ 07 мая 2020

Вам нужно загрузить данные сюда перед сохранением ... Также вам необходимо иметь отдельный класс для сохранения и загрузки данных ... точка, сделайте это в контроллере ... это противоречит принципу единой ответственности ... Функция загрузки должна возвращать массив [Игра] и данные сохранения должны возвращать успех или неудачу

@IBAction func endWLButton(_ sender: UIButton) {
    //load and set data in games from file ...then append current data and save to file 
        if games != nil {
            weekLeague?.append(games!)
        }

        save()
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...