Сохранить данные из JSON во внутреннем устройстве - 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)
    }

}

Я хочу сохранить данные на моем устройстве с этим кодом:

let cms = ServerConnect()
cms.getJsonProducts(lang: selectedLanguage, region: selectedRegion , completion: { (data) in
    switch data {
    case .succes(let data):
        self.saveJsonFileToTheDisk(path: selectedLanguage + "/json/temp.json",  downloadData: data)
    case .error(let error):
        self.errorLoginMessage(txt: "\(ErrorsLabels.MainViewControler01). \(error)", title: "Blad".localized())
        break
    }
})


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 { self.errorLoginMessage(txt: "\(ErrorsLabels.MainViewControler02). \(error)", title: "Blad".localized()) }
}

К сожалению, приложение не сохраняет файл вдиск (он даже не создает его).У меня ошибка:

"Папка temp.json не существует. UserInfo = PNSFilePath = Пользователи / mymac / Библиотека / Разработчик ......... / json / temp.json. .... Нет такого файла или каталога ";

Кто-нибудь знает, в чем здесь проблема?

1 Ответ

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

Вам нужно создать папку и файл, а затем записать в нее.

Приведенный ниже код проверяет, существует ли папка, и если нет, то создает ее.

затем он делает то же самое с файлом.

import UIKit

class ViewController: UIViewController {

    let demoJson = """
    { "name": "John Smith" }
    """
    let folderName = "json"
    let fileName = "demo.json"
    var isDir : ObjCBool = false
    let documentsDir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!

    override func viewDidLoad() {
        super.viewDidLoad()


        createFolderIfNotExists(name: folderName)
        saveJson(json: demoJson, toFile: "/\(folderName)/\(fileName)")

        let filePath = documentsDir.appendingPathComponent("/\(folderName)/\(fileName)")
        fileExists = FileManager.default.fileExists(atPath: filePath.path)

        print("[DEBUG] - File exits value: \(fileExists)")
        print(try? String(contentsOf: filePath))
    }

    func createFolderIfNotExists(name: String) {
        let path = documentsDir.appendingPathComponent(name)
        if FileManager.default.fileExists(atPath: path.path, isDirectory: &isDir) {
            return
        } else {
            do {
                try FileManager.default.createDirectory(at: path, withIntermediateDirectories: false, attributes: nil)
            } catch {
                print(error)
            }
        }
    }

    func saveJson(json: String, toFile: String) {
        let path = documentsDir.appendingPathComponent(toFile)
        if FileManager.default.fileExists(atPath: path.path) {
            return
        }

        if let data = json.data(using: .utf8), FileManager.default.createFile(atPath: path.path, contents: data, attributes: nil) {
            try? data.write(to: path)
        }
    }
}
...