现在我有一个应用程序可以成功地从我的网站解析 JSON。所以每当没有互联网连接时,我的应用程序就会崩溃。现在我正在尝试这样做,以便在没有互联网连接的情况下加载应用程序时,它将显示之前显示的数据。最好的方法是什么?
我阅读了这篇文章,但我不知道如何将 JSON 文件嵌入到我的应用程序包中。有人可以解释如何做到这一点吗?
提前致谢!
最好的方法是:
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];
}
我希望它有帮助!
使用Apple Reachability 示例代码检查您的应用是否能够建立与服务器的连接。
在第一次成功的请求响应时,解析 JSON 并将其作为.plist文件缓存到磁盘。这将节省您再次解析存储的响应。解析的 JSON 响应可以是 aNSDictionary
或NSArray
. 使用writeToFile:atomically:
API 将其写入磁盘。
在后续请求中,如果可达性失败,即没有网络连接,则从磁盘读取缓存的响应。您需要确定缓存持续时间并在获取新响应时更新 plist。
希望有帮助!
编辑:
我想我没有完全理解这个问题。感谢 Xman 指出这一点。在这种情况下,我会做的是 - 将最后加载的 JSON 文件保存到我的包中,并在查询服务器和在后台加载更新时使用它来显示信息。
流程应该是这样的:
这个 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 信息。如何解析它取决于您。