Как сохранить UICollectionView Cache после закрытия приложения и открытия с помощью Swift? - PullRequest
0 голосов
/ 07 ноября 2019

В моем сценарии я пытаюсь сохранить данные cache для UICollectionView. Здесь VC2 до VC1 Я передаю данные массива и VC1 Я загружаю переданные данные в UICollectionView. Теперь, если я закрою и снова открою приложение, то не смогу увидеть данные UICollectionView. Все они удалены, но я должен поддерживать кеш. Как это сделать?

Загрузка данных представления коллекции из переданного массива VC2

 func pass(data: [TeamListData]) {
        print("ARRAY DATA RECEIVED:\(data)")
        participantsData = data
        self.collectionView.reloadData()
    }

Данные моего массива

ARRAY DATA RECEIVED:[TeamListData(userid: Optional("1"), firstname: Optional(“abc”), designation: Optional("Analyst"), profileimage: Optional(“url.jpg"), isSelected: true), TeamListData(userid: Optional(“2”), firstname: Optional(“def”), designation: Optional("Executive"), profileimage: Optional(“url.jpg"), isSelected: true)]

Ответы [ 2 ]

1 голос
/ 07 ноября 2019

Вы ищете не кеш, а постоянное хранилище. В зависимости от того, откуда поступают ваши данные и насколько вам нужно хорошее решение, вы можете использовать диск, UserDefaults или подход к базе данных, такой как CoreData, Realm или др.

Есть удобное руководство с большим количеством кодаздесь для хранения пользовательских объектов в UserDefaults с NSCoding: https://developer.apple.com/library/archive/referencelibrary/GettingStarted/DevelopiOSAppsSwift/PersistData.html

Например

В соответствии с NSCoding:

struct PropertyKey {
    static let name = "name"
    static let photo = "photo"
    static let rating = "rating"
}

class Meal: NSObject, NSCoding {
    let name: String
    let photo: UIImage
    let rating: Int

    required convenience init?(coder aDecoder: NSCoder) {
        // The name is required. If we cannot decode a name string, the initializer should fail.
        guard let name = aDecoder.decodeObject(forKey: PropertyKey.name) as? String else {
            return nil
        }

        // Because photo is an optional property of Meal, just use conditional cast.
        let photo = aDecoder.decodeObject(forKey: PropertyKey.photo) as? UIImage
        let rating = aDecoder.decodeInteger(forKey: PropertyKey.rating)

        // Must call designated initializer.
        self.init(name: name, photo: photo, rating: rating)

    }
    func encode(with aCoder: NSCoder) {
        aCoder.encode(name, forKey: PropertyKey.name)
        aCoder.encode(photo, forKey: PropertyKey.photo)
        aCoder.encode(rating, forKey: PropertyKey.rating)
    }
}

Сохранение данных:

private func saveMeals() {
    let isSuccessfulSave = NSKeyedArchiver.archiveRootObject(meals, toFile: Meal.ArchiveURL.path)
    if isSuccessfulSave {
        os_log("Meals successfully saved.", log: OSLog.default, type: .debug)
    } else {
        os_log("Failed to save meals...", log: OSLog.default, type: .error)
    }
}

Загрузка данных:

private func loadMeals() -> [Meal]?  {
    return NSKeyedUnarchiver.unarchiveObject(withFile: Meal.ArchiveURL.path) as? [Meal]
}

С другой стороны, Realm предлагает большую гибкость, позволяя потратить немного больше времени на изучение третьей стороны lib: https://realm.io/docs/swift/latest/#models

1 голос
/ 07 ноября 2019

Сохраненные данные после получения обратного вызова в VC1

Код

 func pass(data: [TeamListData]) {
        print("ARRAY DATA RECEIVED:\(data)")
        participantsData = data
        self.collectionView.reloadData()
        UserDefaults.standard.setValue( try? PropertyListEncoder().encode(data), forKey: "sessiondata")
    }

Внутри viewDidLoad в VC1

func storeValidaion(){
        // Retrive Array Values
        if participantsData == nil  {
            if let data = UserDefaults.standard.value(forKey:"sessiondata") as? Data {
                guard let sessionData = try? PropertyListDecoder().decode(Array<TeamListData>.self, from: data) else {
                    return
                }

                print("ARRAY VALUES: \(sessionData)")
                self.participantsData = sessionData
                self.collectionView.reloadData()
            }
        }

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