0

我目前正在使用来自远程 Web 服务的 JSON 数据(NSArray 格式)填充 UITableView。我想通过调用 web 服务并将 JSON 数据存储到本地文件来加速应用程序。

另外,这是一个好方法吗?这样用户就不必一直下载数据了?

我坚持的是如何将远程 JSON 文件保存到本地文件。在我的-(void)saveJsonWithData:(NSData *)data方法中,我如何保存远程数据。

这是我目前使用的代码(来自一些 Stackoverflow 搜索)

-(void)saveJsonWithData:(NSData *)data{

 NSString *jsonPath=[[NSSearchPathForDirectoriesInDomains(NSUserDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingFormat:@"/data.json"];

 [data writeToFile:jsonPath atomically:YES];

}

-(NSData *)getSavedJsonData{
    NSString *jsonPath=[[NSSearchPathForDirectoriesInDomains(NSUserDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingFormat:@"/data.json"];

    return [NSData dataWithContentsOfFile:jsonPath]
}

然后调用函数为

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{

    [self saveJsonWithData:data];
}

感谢帮助

4

2 回答 2

1

在 iOS 上,您应该使用它NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)来获取文档目录。没有用户目录。

于 2013-09-05T09:29:28.290 回答
0

让 iOS 做 JSON 解析,然后通过输出流将其写入纯文本文件

NSData *jsonData = yourData;
NSError *error;

// array of dictionary
NSArray *array = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableLeaves error:&error];

if (error) {
    NSLog(@"Error: %@", error.localizedDescription);
} else {
    NSArray *documentsSearchPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [documentsSearchPaths count] == 0 ? nil : [documentsSearchPaths objectAtIndex:0];

    NSString *fileName = @"file.json";

    NSString *filePath = [documentsDirectory stringByAppendingPathComponent:fileName];

    NSOutputStream *outputStream = [NSOutputStream outputStreamToFileAtPath:filePath append:YES];
    [outputStream open];

    [NSJSONSerialization writeJSONObject:array
                                toStream:outputStream
                                 options:kNilOptions
                                   error:&error];
    [outputStream close];
}
于 2013-09-05T09:51:34.073 回答