【问题标题】:How to read and save data from a remote plist file如何从远程 plist 文件中读取和保存数据
【发布时间】:2017-04-23 02:01:45
【问题描述】:

我需要帮助才能使用 Swift 在我的 iOS 应用程序中的远程 plist 文件中读取和写入数据。 我可以在本地读取和保存数据,但不能使用远程服务器。

这里,我要在本地读取的代码。

变量

    var VintiInizialiID: AnyObject!
    var PersiInizialiID: AnyObject!
    var CampionatoID: AnyObject!
    var coefficientetorneoID: AnyObject!

加载PlistData()

func loadPlistData() {

    var VintiInizialiKey = "VintiIniziali"
    var PersiInizialiKey = "PersiIniziali"
    var TutorialKey = "Tutorial"
    var coefficientetorneoKey = "CoefficienteTorneo"
    var CampionatoKey = "Campionato"


    // getting path to database.plist
    let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) as NSArray
    let documentsDirectory = paths[0] as! String
    let path = documentsDirectory.stringByAppendingPathComponent("database.plist")

    let fileManager = NSFileManager.defaultManager()

    //check if file exists
    if(!fileManager.fileExistsAtPath(path)) {
        // If it doesn't, copy it from the default file in the Bundle
        if let bundlePath = NSBundle.mainBundle().pathForResource("database", ofType: "plist") {

            let resultDictionary = NSMutableDictionary(contentsOfFile: bundlePath)
            println("Bundle database.plist file is --> \(resultDictionary?.description)")

            fileManager.copyItemAtPath(bundlePath, toPath: path, error: nil)
            println("copy")
        } else {
            println("database.plist not found. Please, make sure it is part of the bundle.")
        }
    } else {
        println("database.plist already exits at path.")
        // use this to delete file from documents directory
        //fileManager.removeItemAtPath(path, error: nil)
    }

    let resultDictionary = NSMutableDictionary(contentsOfFile: path)
    println("Loaded database.plist file is --> \(resultDictionary?.description)")

    var myDict = NSDictionary(contentsOfFile: path)

    if let dict = myDict {
        //loading values
        VintiInizialiID = dict.objectForKey(VintiInizialiKey)!
        PersiInizialiID = dict.objectForKey(PersiInizialiKey)!
                     CampionatoID = dict.objectForKey(CampionatoKey)!
       coefficientetorneoID = dict.objectForKey(coefficientetorneoKey)!


        //...
    } else {
        println("WARNING: Couldn't create dictionary from GameData.plist! Default values will be used!")
    }
}

最后是 SavePlistData()

func Saveplistdata()  {



    let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) as NSArray
    let documentsDirectory = paths.objectAtIndex(0)as! NSString
    let path = documentsDirectory.stringByAppendingPathComponent("database.plist")

    var dict: NSMutableDictionary = ["XInitializerItem": "DoNotEverChangeMe"]
    //saving values
    dict.setObject(VintiInizialiID, forKey: "VintiIniziali")
    dict.setObject(PersiInizialiID, forKey: "PersiIniziali")
    dict.setObject(CampionatoID, forKey: "Campionato")
    dict.setObject(coefficientetorneoID, forKey: "CoefficienteTorneo")

    //...

    //writing to database.plist
    dict.writeToFile(path, atomically: false)

    let resultDictionary = NSMutableDictionary(contentsOfFile: path)
   // println("Saved database.plist file is --> \(resultDictionary?.description)")
}

【问题讨论】:

  • 您究竟需要什么帮助?您能否更具体地了解“远程服务器”?
  • 我的意思是:在我的 remore 域中有一个 plist 文件。我如何在这里阅读和保存信息?
  • 我不确定使用存储在远程服务器上的 plist 是否是正确的选择。如果你有不止一个人在做这件事,就会有很多问题需要处理。如果你想走这条路,在本地下载文件,在本地更改,然后上传到服务器。但是,对于远程配置,您可以使用许多替代方案,例如 CloudKit、Parse 或类似的。
  • 我认为@ScottH 最终是正确的。我只在这个问题上开了一个赏金来获得投资者徽章。虽然我很好奇是否有人能想出一些巧妙的方法来解决这个问题。事实是,plist 对于认真的坚持来说是一个糟糕的选择。看看 Parse,它有一个非常友好的 API。

标签: ios swift plist


【解决方案1】:

不,没有一种本地方式可以仅使用 Swift 读取写入到外部 .plist 而无需下载文件、进行更改和重新上传它。或者,您需要在服务器上设置自己的 API,以便为您执行读/写操作。

正如@Scott H 在 cmets 中所说,有更好的方法来做到这一点:

如果你想走这条路,把文件下载到本地,改一下 本地,然后上传到服务器。然而,有很多 CloudKit 等远程配置可供您使用的替代方案, 解析,或类似的。

详细了解第 3 方选项:

【讨论】:

  • 谢谢,祝您有美好的一天。
【解决方案2】:

NSMutableDictionary(contentsOfFile: bundlePath)

请改用contentsOfURL

【讨论】:

  • 不,人们正在编辑你的帖子,因为你不应该在你的帖子正文中添加评论,如果你有评论,把它放在它应该去的地方,在 cmets...我很抱歉如果我冒犯了你,我可能已经不合时宜了,但是如果你遵循 Stack Overflow 的回答指南:How to Answer,则可以避免这种混淆。
  • 顺便说一句,堆栈溢出的任何内容都无法隐藏。堆栈溢出会保存每个帖子(和评论)的每个版本。只需点击帖子上的编辑,即可查看修订历史
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-17
  • 1970-01-01
相关资源
最近更新 更多