How to save an array as a json file in Swift?

前端 未结 6 1811
旧时难觅i
旧时难觅i 2020-12-04 11:33

I\'m new at swift and I\'m having trouble with this. so what i need to do is save this array as a json file in the document folder of the iphone.

var levels          


        
6条回答
  •  独厮守ぢ
    2020-12-04 12:00

    Here is generic Swift solution

    I have created generic class which allows to do it easily

    //
    //  OfflineManager.swift
    // 
    //
    //  Created by Prashant on 01/05/18.
    //  Copyright © 2018 Prashant. All rights reserved.
    //
    
    import UIKit
    
    class OfflineManager: NSObject {
    
        static let sharedManager = OfflineManager()
        let LocalServiceCacheDownloadDir        = "LocalData"
    
        // Replace case as your naming 
    
        enum WSCacheKeys {
            case CampignList . 
            case CampignDetail(id:String)
            case ScreenShotList
    
            var value:String {
                switch self {
                case .CampignList:
                  return  "CampignList"
                case .CampignDetail(let id):
                    return id
                case .ScreenShotList :
                    return "ScreenShotList"
                }
    
            }
        }
    
        func getBaseForCacheLocal(with fileName:String) -> String? {
    
            let filePath = FileManager.default.getDocumentPath(forItemName: self.LocalServiceCacheDownloadDir)
            if FileManager.default.directoryExists(atPath: filePath) {
                return filePath.stringByAppendingPathComponent(fileName)
            } else {
                if  FileManager.default.createDirectory(withFolderName: self.LocalServiceCacheDownloadDir) {
                    return filePath.stringByAppendingPathComponent(fileName)
                }
            }
            return nil
        }
    
    
    
        //------------------------------------------------------------
    
        @discardableResult
        func cacheDataToLocal(with Object:T,to key:WSCacheKeys) -> Bool {
            let success = NSKeyedArchiver.archiveRootObject(Object, toFile: getBaseForCacheLocal(with: key.value)!)
            if success {
                print( "Local Data Cached\(String(describing: getBaseForCacheLocal(with: key.value)))")
            } else {
                print("Error")
            }
    
            return success
    
        }
    
        //------------------------------------------------------------
    
        func loadCachedDataFromLocal(with key:WSCacheKeys ) -> T? {
            return NSKeyedUnarchiver.unarchiveObject(withFile: getBaseForCacheLocal(with: key.value)!) as? T
        }
    
    
        //------------------------------------------------------------
    
    
        func removeAllCacheDirs () {
            do {
                try FileManager.default.removeItem(atPath: self.getBaseForCacheLocal(with: "")!)
    
            } catch {
                print("error in remove dir \(error.localizedDescription)")
            }
    
        }
    
        //--------------------------------------------------------------------------------
    
    
    }
    

    Here is some helper methods of extension FileManager

    public var getDocumentDirectoryPath: String {
        let documentDirectory = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
        return documentDirectory
    }
    
    public func getDocumentPath(forItemName name: String)-> String {
        return getDocumentDirectoryPath.stringByAppendingPathComponent(name)
    }
    
    public func directoryExists(atPath filePath: String)-> Bool {
        var isDir = ObjCBool(true)
        return FileManager.default.fileExists(atPath: filePath, isDirectory: &isDir )
    }
    
    public func createDirectory(withFolderName name: String)-> Bool {
        let finalPath = getDocumentDirectoryPath.stringByAppendingPathComponent(name)
        return createDirectory(atPath: finalPath)
    }
    

    Here Is String extension's method

    public func stringByAppendingPathComponent(_ path: String) -> String {
        let fileUrl = URL.init(fileURLWithPath: self)
        let filePath = fileUrl.appendingPathComponent(path).path
        return filePath
    }
    

    How to use it ?

    To save

       OfflineManager.sharedManager.cacheDataToLocal(with: object as! [String:Any], to: .CampignList)
    

    To read data

        DispatchQueue.global().async {
            // GET OFFLINE DATA
            if let object:[String:Any] = OfflineManager.sharedManager.loadCachedDataFromLocal(with: .CampignList) {
                do {
                    let data = try  JSONSerialization.data(withJSONObject: object, options: [])
                    let object = try CampaignListResponse.init(data: data)
                    self.arrCampignList = object.data ?? []
                    DispatchQueue.main.async {
                        self.tableVIew.reloadData()
                    }
                } catch {
                }
            }
          }
    

    Note: You can define your own WSCacheKeys for type of your json like i am fetching some campaign list

提交回复
热议问题