如何使用本地数据加载应用程序,然后在线时更新它。

时间:2013-09-10 08:05:30

标签: ios xcode json parsing local

现在我有一个成功从我的网站解析JSON的应用程序。因此,每当没有互联网连接时,我的应用程序崩溃了。现在我试图让它成为当应用程序加载没有互联网连接时,它将显示以前显示的数据。最好的方法是什么?

我读了this article但我不知道如何将JSON文件嵌入到我的应用包中。有人可以解释一下如何做到这一点吗?

提前致谢!

3 个答案:

答案 0 :(得分:1)

最好的方法是:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"YourParsedJSON.plist"];

NSFileManager *fileManager = [NSFileManager defaultManager];

if (noInternet){
   if ([fileManager fileExistsAtPath: path]){

   // if this is true, you have a saved version of your JSON
         YourArray = [[NSMutableArray alloc] initWithContentsOfFile: path];
         // or
         YourDict = [[NSMutableArray alloc] initWithContentsOfFile: path];
   }
   else{
    // first time the app is running, and no internet, no json, inform user about this

    }

}
else{
    // make an array or dictionary ( what is your JSON )
        // response can be a NSDictionary or NSArray
        // YourArray = parsedJSON  or YourDict = parsedJSON

        [YourArray writeToFile:path atomically:YES];
        //or
        [YourDictionary writeToFile:path atomically:YES];
    }

我希望它有所帮助!

答案 1 :(得分:1)

使用Apple Reachability sample code检查您的应用是否能够与您的服务器建立连接。

首次成功请求响应时,解析JSON并将其作为 .plist 文件缓存到磁盘。这将节省您再次解析存储的响应。解析后的JSON响应可以是NSDictionaryNSArray。使用writeToFile:atomically: API write it to disk

在后续请求中,如果可达性失败,即没有网络连接,则从磁盘读取缓存的响应。您需要确定缓存持续时间并在获取新响应时更新plist。

希望有所帮助!

答案 2 :(得分:0)

编辑:

我想我完全不理解这个问题。谢谢Xman,指出来了。在这种情况下我要做的是 - 将最后加载的JSON文件保存到我的包中,并在查询服务器和在后台加载更新时使用它来显示信息。

流程应如下所示:

  1. 使用本地JSON文件解析并显示数据。 (假设有JSON文件的本地副本)
  2. 查询服务器以获取最新数据。
  3. 收到回复后,使用最新的JSON文件更新捆绑包。
  4. 然后,执行步骤1.如果没有JSON文件,只需从步骤2开始。如果出现网络错误,则显示相应的信息。
  5. 此SO问题解答了如何处理iOS中的网络连接: How to check for an active Internet connection on iOS or OSX?

    在本地保存文件: 假设您在NSString(responseString)中有未解析的JSON数据,请执行以下操作:

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *filePath = [NSString stringWithFormat:@"%@/%@", documentsDirectory, @"latest_json.json"];
    
    NSError *error;
    [jsonString_ writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:&error];
    NSLog(@"%@", error)
    

    阅读文件

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *filePath = [NSString stringWithFormat:@"%@/%@", documentsDirectory, @"latest_json.json"];
    NSString *jsonString_ = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:&error];
    

    上一个答案

    嵌入JSON文件类似于将任何资源嵌入到项目中。以下方法向您展示我如何添加XML文件并在我的应用程序中访问它。

    将JSON / XML文件拖放到XCode窗口中的资源组/文件夹中。如果您没有Resouces文件夹,最好创建它。然后在你的代码中执行以下操作:

    NSString* filePath_ = [[NSBundle mainBundle] pathForResource:@"fileName" ofType:@"json"];
    NSString *jsonString = [[NSString alloc] initWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error: NULL];
    

    变量jsonstring包含JSON信息。你想要解析它是由你决定的。