Как сохранить данные, загруженные из Интернета, на внутреннее устройство? - PullRequest
0 голосов
/ 21 мая 2018

У меня есть этот код:

struct ServerConnect {
    enum Result<T> {
        case succes(T)
        case error(String)
    }

    typealias completionHandler = (Result<Data >) -> ()

    func getJsonFromServer(parameters: String, completion: @escaping completionHandler) {
        let fullUrlString = ApiConstans.fullPath + parameters
        guard let url = URL(string: fullUrlString) else {
            debugPrint("\(ErrorsLabels.ServerConnect01)")
            return completion(.error("\(ErrorsLabels.ServerConnect01)"))
        }

        URLSession.shared.dataTask(with: url) {  (data, response, error) in
            guard error == nil else {
                debugPrint("\(ErrorsLabels.ServerConnect02)")
                return completion(.error("\(ErrorsLabels.ServerConnect02)"))
            }

            guard let data = data else {
                debugPrint("\(ErrorsLabels.ServerConnect03)")
                return completion(.error("\(ErrorsLabels.ServerConnect03)"))
            }

            debugPrint("R> \(fullUrlString)")
            return completion(.succes(data))
            }.resume()
    }


    func getJsonProducts(lang: String?, region: Int?, completion: @escaping completionHandler) {
        self.getJsonFromServer(parameters: "?action=GET_PRODUCTS&lang=\(lang!)&region=\(region!)", completion: completion)
    }

}

Я хочу сохранить загруженные данные из Интернета в памяти устройства.

Я пытаюсь этот код:

getJsonProducts(lang: selectedLanguage, region: selectedRegion , completion: { (data) in
                    print("@@@@@ \(data)")
                     saveJsonFileToTheDisk(path: selectedLanguage + "/json/products.json",  downloadData: data)
                })

func saveJsonFileToTheDisk(path: String, downloadData: Data){
        do {
            let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
            let fileURL = documentsURL.appendingPathComponent(path)
            try downloadData.write(to: fileURL, options: .atomic)
        } catch { }
    }

Но, к сожалению, это не работает.Как я могу заставить его работать?

Ниже приведена ошибка:

Невозможно преобразовать значение типа 'ServerConnect.Result' в ожидаемый тип аргумента 'Data'

Ответы [ 2 ]

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

Ваш completionHandler из getJsonProducts возвращает Result<Data>, а не простой Data, поэтому вам необходимо сопоставить шаблон с экземпляром Result, поскольку он может не содержать Data, он может содержатьString ошибка.

getJsonProducts(lang: selectedLanguage, region: selectedRegion , completion: { (data) in
    switch data {
        case let .succes(data):
            print("@@@@@ \(data)")
            saveJsonFileToTheDisk(path: selectedLanguage + "/json/products.json",  downloadData: data)
       case let .error(error):
            print(error)
    }
})
0 голосов
/ 21 мая 2018

Согласно определению метода getJsonProducts:

func getJsonProducts(lang: String?, region: Int?, completion: @escaping (Result<Data>) -> ()) {

Параметр data, который отправляется в блок completion, на самом деле имеет тип Result, содержащий данные, а не сами данные,Таким образом, вы должны сделать:

getJsonProducts(lang: selectedLanguage, region: selectedRegion, completion: { result in
    switch result {
    case .succes(let data):
        saveJsonFileToTheDisk(path: selectedLanguage + "/json/products.json",  downloadData: data)
    case .error(let errorMessage):
        // Do something with the error message.
        break
    }
})
...