Быстрое добавление ключа в локальный JSON для сохранения галочек - PullRequest
0 голосов
/ 10 мая 2018

Я пытаюсь сохранить галочки в моем приложении.Но из-за того, что я извлекаю свои данные из API. Я не знаю, как я могу добавить, как ключ «проверено».Дело в том, что JSON загружается раз в неделю, добавляя новый контент.Есть ли способ сохранить мои галочки?

struct Base : Codable {
    let expireDate : String
    let Week : [Weeks]
}

struct Weeks : Codable {
    let name : String
    let items : [Items]
}

struct Items : Codable {
    let Icon: String
    let text : String
}

В моем RootTableView у меня есть массив недель, и я хотел бы добавить галочки в дочерние элементы tableView.

Заранее спасибо

ОБНОВЛЕНИЕ:

  //
    //      Download JSON
    //
    enum Result<Value> {
        case success(Value)
        case failure(Error)
    }

    func getItems(for userId: Int, completion: ((Result<Base>) -> Void)?) {
        var urlComponents = URLComponents()
        urlComponents.scheme = "https"
        urlComponents.host = "api.jsonbin.io"
        print(NSLocale.preferredLanguages[0])

        let preferredLanguage = NSLocale.preferredLanguages[0]
        if preferredLanguage.starts(with: "de"){
            urlComponents.path = "/b/xyz"
        }
        else
        {
            urlComponents.path = "/xyz"
        }

        let userIdItem = URLQueryItem(name: "userId", value: "\(userId)")
        urlComponents.queryItems = [userIdItem]
        guard let url = urlComponents.url else { fatalError("Could not create URL from components") }

        var request = URLRequest(url: url)
        request.httpMethod = "GET"


        let config = URLSessionConfiguration.default
        config.httpAdditionalHeaders = [
        "secret-key": "xyzzy"
        ]

        let session = URLSession(configuration: config)
        let task = session.dataTask(with: request) { (responseData, response, responseError) in
            DispatchQueue.main.async {
                if let error = responseError {
                    completion?(.failure(error))
                } else if let jsonDataItems = responseData {
                    let decoder = JSONDecoder()

                    do {
                        let items = try decoder.decode(Base.self, from: jsonDataItems)
                        completion?(.success(items))
                    } catch {
                        completion?(.failure(error))
                    }
                } else {
                    let error = NSError(domain: "", code: 0, userInfo: [NSLocalizedDescriptionKey : "Data was not retrieved from request"]) as Error
                    completion?(.failure(error))
                }
            }
        }

        task.resume()
    }


    func loadJson() {
        getItems(for: 1) { (result) in
            switch result {
            case .success(let item):
                self.saveItemsToDisk(items: item)
                self.defaults.set(item.expireDate, forKey: "LastUpdateItems")
            case .failure(let error):
            fatalError("error: \(error.localizedDescription)")
            }
            self.getItemesFromDisk()
        }
    }

    //
    //      Save Json Local
    //

    func getDocumentsURL() -> URL {
        if let url = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first {
            return url
        } else {
            fatalError("Could not retrieve documents directory")
        }
    }

    func saveItemsToDisk(items: Base) {
        // 1. Create a URL for documents-directory/items.json
        let url = getDocumentsURL().appendingPathComponent("items.json")
        // 2. Endcode our [Item] data to JSON Data
        let encoder = JSONEncoder()
        do {
            let data = try encoder.encode(items)
            // 3. Write this data to the url specified in step 1
            try data.write(to: url, options: [])
        } catch {
            fatalError(error.localizedDescription)
        }
    }

    func getItmesFromDisk(){
        // 1. Create a url for documents-directory/items.json
        let url = getDocumentsURL().appendingPathComponent("items.json")
        let decoder = JSONDecoder()
        do {
            // 2. Retrieve the data on the file in this path (if there is any)
            let data = try Data(contentsOf: url)
            // 3. Decode an array of items from this Data
            let items = try decoder.decode(Base.self, from: data)
            itemsDisk = items
        } catch {

        }
    }

1 Ответ

0 голосов
/ 11 мая 2018

Я бы создал класс-оболочку (или структуру) для Items, скажем, MyItem, которая содержит исходный объект Items и свойство checkmark.

class MyItem {
    let item: Items
    var checkmark: Bool
    //more properties...?

    init(withItem item: Items {
        this.item = item  
        this.checkmark = false
    }

    func isEqual(otherItem item: Items) -> Bool {
        return this.item == item
    }
}

isEqual используется для проверки, существует ли уже объект MyItem для загруженного объекта Items или должен быть создан новый. isEqual предполагает, что вы изменили структуру Items для реализации протокола Equatable.

Возможно, вам также необходимо заменить недели, но здесь вам не нужно включать исходный объект недели.

class MyWeek {
    let name: String
    let items: [MyItem]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...