2

现在我有一个应用程序可以成功地从我的网站解析 JSON。所以每当没有互联网连接时,我的应用程序就会崩溃。现在我正在尝试这样做,以便在没有互联网连接的情况下加载应用程序时,它将显示之前显示的数据。最好的方法是什么?

我阅读了这篇文章,但我不知道如何将 JSON 文件嵌入到我的应用程序包中。有人可以解释如何做到这一点吗?

提前致谢!

4

3 回答 3

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];
    }

我希望它有帮助!

于 2013-09-10T08:16:32.847 回答
1

使用Apple Reachability 示例代码检查您的应用是否能够建立与服务器的连接。

在第一次成功的请求响应时,解析 JSON 并将其作为.plist文件缓存到磁盘。这将节省您再次解析存储的响应。解析的 JSON 响应可以是 aNSDictionaryNSArray. 使用writeToFile:atomically:API 将其写入磁盘

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

希望有帮助!

于 2013-09-10T08:18:07.013 回答
0

编辑:

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

流程应该是这样的:

  1. 使用本地 JSON 文件解析和显示数据。(假设有 JSON 文件的本地副本)
  2. 查询服务器以获取最新数据。
  3. 收到响应后,使用最新的 JSON 文件更新捆绑包。
  4. 然后,执行第 1 步。如果没有 JSON 文件,则从第 2 步开始。如果出现网络错误,请显示相应的信息。

这个 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 信息。如何解析它取决于您。

于 2013-09-10T08:15:42.067 回答