如何在swift中保存和获取文件中的数据?

时间:2016-08-22 06:02:44

标签: ios swift

我想将JSON中的响应保存在文件中,并在网络不可用时从中获取。然而,在试图通过禁用wifi获取想法时,应用程序总是崩溃。除了保存在数据库中之外,还有其他方法可以在swift中进行脱机提取吗?

  

这是我得到的错误:无法将'Swift._NSContiguousString'(0x109e22320)类型的值转换为'NSArray'

这是我到目前为止所做的:

  • 创建模型

    class func loadSavedFile(fileName: String) -> AnyObject? {
        let pathString: String = Utility.fetchFilePathString(fileName)
        print("Here the pathString is \(pathString)")
        if NSFileManager.defaultManager().fileExistsAtPath(pathString) {
            return NSKeyedUnarchiver.unarchiveObjectWithFile(pathString)!
        } else {
            return "File doesn't exist"
        }
        return ""
    }
    
    class func saveObject(object: AnyObject, toFile fileName: String) {
        let pathString: String = Utility.fetchFilePathString(fileName)
        NSKeyedArchiver.archiveRootObject(object, toFile: pathString)
    }
    
    class func fetchFilePathString(fileName: String) -> String {
        let pathAray: [AnyObject] = NSSearchPathForDirectoriesInDomains(.DocumentDirectory,.AllDomainsMask, true)
        let pathString = pathAray.last!
        return NSURL(fileURLWithPath: pathString as! String).URLByAppendingPathComponent(fileName).absoluteString
    }
    
  • 从文件中保存和加载数据的代码

    var directoryArr  = [Directory]()
    override func viewDidLoad() {
    
        super.viewDidLoad()
    
        if Utility.isNetworkReachable() {
            Utility.saveObject([], toFile: Constants.File.kDirectory)
            self.serviceCallDirectory()
        } else {
            self.directorie = (Utility.loadSavedFile(Constants.File.kDirectory) as? [Directory])!
            self.tableView.reloadData()
        }
    
  • 在视图控制器中检查网络连接

    func serviceCallDirectory() -> Void {
        let stringUrl = Constants.baseUrl + Constants.kDirectoryUrl
        WebService.getRequestAPI(stringUrl, withSuccess:  {(responseDic, Statusflag,error) in
            if Statusflag {
                self.tableView.backgroundColor = UIColor.clearColor()
                self.tableView.hidden = false
    
                let tempInfo = responseDic![Constants.kData] as! [AnyObject]
                var imgthumbnail : String = ""
                var imgmedium : String = ""
                var imglarge : String = ""
                var name  : String = ""
                var child : String = ""
                if tempInfo.count != 0 {
                    for info in tempInfo {
                        let tid = info[Constants.Directory.tid] as! String
                        let vid = info[Constants.Directory.vid] as! String
                        if let names = info[Constants.Directory.kName] as? String {
                            name = names
                        }
                        if let childs = info[Constants.Directory.kChild] as? String {
                            child = childs
                        }
    
    
                        if let imgthumb = info[Constants.Directory.kImageThumbnail] as? String {
    
                            imgthumbnail = imgthumb
                        } else {
                            imgthumbnail = ""
                        }
                        if let imgmediumd = info[Constants.Directory.kImageMedium] as? String {
    
                            imgmedium = imgmediumd
                        } else {
                            imgmedium = ""
                        }
    
    
                        if let imglarges = info[Constants.Directory.kImageLarge] as? String {
                            imglarge = imglarges
                        }
    
    
                        let myModel = Directory(
    
                            data: tempInfo,
                            tid: tid,
                            vid: vid,
                            name: name,
                            imgThumbnail: imgthumbnail,
                            imgMedium: imgmedium,
                            imgLarge: "",
                            child: child
    
                        )
    
    
                        self.directorie.append(myModel)
                    }
    
  • 服务电话

    await Task.Run(async () =>
    {
        await DoAsyncMethodAsync();
    });
    

1 个答案:

答案 0 :(得分:1)

我不知道这是唯一的问题,但这段代码

class func loadSavedFile(fileName: String) -> AnyObject? {
    let pathString: String = Utility.fetchFilePathString(fileName)
    print("Here the pathString is \(pathString)")
    if NSFileManager.defaultManager().fileExistsAtPath(pathString) {
        return NSKeyedUnarchiver.unarchiveObjectWithFile(pathString)!
    } else {
        return "File doesn't exist"
    }
    return ""
}

返回对象或字符串。这不是很明智。它应返回成功标志或元组或使用完成块。当你调用这个函数时,你的代码希望得到一个目录数组,在许多情况下都不会发生

self.directorie = (Utility.loadSavedFile(Constants.File.kDirectory) as? [Directory])!

您的问题中的错误表示不同类型的数据不匹配。你应该尽量不要使用AnyObject,快速帮助你键入检查你正在做什么......