Search code examples
swiftswift3nsfilemanagernskeyedarchivernskeyedunarchiver

NSKeyedUnarchiver.unarchiveObject() unarchives old object


I want to save the user's filter selections on FilterViewController.

When FilterViewController is closed, NSKeyedArchiver.archiveRootObject archives the user's selections. However, NSKeyedUnarchiver.unarchiveObject opens up the initial default selections (NOT the user's selections). How to fix this?

FiltersViewController.swift

override func viewWillAppear(_ animated: Bool) {
       if let filterSections = NSKeyedUnarchiver.unarchiveObject(withFile: filterViewModel.filtersFilePath) as? [FilterSection] {
            // Retrieves initial default selections, NOT user's selection
            filterViewModel.filterSections = filterSections 
            filtersTableView.reloadData()
        }
    }

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    // Saves what user selects
    let isSuccessful = NSKeyedArchiver.archiveRootObject(self.filterViewModel.filterSections, toFile: self.filterViewModel.filtersFilePath) 
    if (isSuccessful) {
        print("Saved filters") // This is printed
    } else  {
        print("Didn't Save filters")
    }
}

FilterViewModel.swift

class FilterViewModel: NSObject {
    // Contains all filtered sections displayed on table view
    var filterSections: [FilterSection] = []
    // File Path to saved Filter Sections
    var filtersFilePath: String {
        let manager = FileManager.default
        let url = manager.urls(for: .documentDirectory, in: .userDomainMask).first
        print("this is the url path in the documentDirectory \(url)")
        return (url!.appendingPathComponent("FilterSelectionData").path)
    }

    override init() {
         super.init()
         filterSections = self.getFilterSections()
    }

}

CompanyViewController.swift

@objc func filterButtonTapped() {
        var filterViewModel: FilterViewModel
        if (self.filterViewModel != nil) {
            filterViewModel = self.filterViewModel! // This runs
        }
        else {
            self.filterViewModel = FilterViewModel()
            filterViewModel = self.filterViewModel!
        }
        let filtersVC = FiltersViewController(filterViewModel: filterViewModel)
        self.navigationController?.pushViewController(filtersVC, animated: true)

    }

Solution

  • You are using self.getFilterSections to set filterSections in FilterViewModel init. I suppose self.getFilterSections is a method that returns the default values. For me, it should not be the case, rather if you have archived some values, you should get that in this method.

    Although, this alone should not be the reason for the issue, but may be a reason for inducing bug. Try changing self.getFilterSections to return archived values if possible otherwise default values and check whether the bug is still there.