Добавление, изменение и удаление с различным источником данных - PullRequest
0 голосов
/ 19 апреля 2020

Хорошо, у меня есть предварительная рабочая версия представления коллекции с доступным источником данных. Все работает, и я только что добавил добавление и изменение элементов, а удаление элементов еще предстоит сделать. На данный момент имеется мало информации о добавлении, изменении и удалении элементов с доступным источником данных. Интересно, все ли массивы, которые я делаю, это путь к go. Я чувствую, что должен сделать больше со снимком. Должны ли все логи c из метода сохранения быть в методе обновления? Любая помощь оценена и / или любые ресурсы по этому вопросу

ProjectsViewController: UIViewController {
(...)
    //DataSource methods (snapshot)
    func updateData(on projects: [Project]) {
        var snapshot = NSDiffableDataSourceSnapshot<Section, Project>()
        snapshot.appendSections([Section.normal])
        snapshot.appendItems(projects)

        //apply() is safe to call from a background queue!
        self.dataSource.apply(snapshot, animatingDifferences: true)
    }

(...)
}

//MARK: - ProjectHandler (delegation method)
extension ProjectsViewController: ProjectHandler {
    func save(_ project: Project, withImage image: UIImage?) {
        //Make sure LastEdited Date gets updated
        var projectToBeSaved = project
        projectToBeSaved.lastEdited = Date()

        //Current state
        var projects = dataSource.snapshot().itemIdentifiers

        //Replace the changed project
        if projects.contains(projectToBeSaved) {
            let index = projects.firstIndex(of: projectToBeSaved)
            projects.remove(at: index!)
            projects.append(projectToBeSaved)
        //Add the new projects
        } else {
            projects.append(projectToBeSaved)
        }

        //sort on lastly edited
        projects.sort { $0.lastEdited > $1.lastEdited }

        //TODO: - Write to json

        //update the snapshot
        updateData(on: projects)
        collectionView.reloadData()
    }
}

...