我的服务器正在向我发送JSON响应,如下所示:
[
{
"fields": {
"message": "Major Network Problems",
"message_detail": "This is a test message"
},
"model": "notification",
"pk": 5
},
{
"fields": {
"message": "test",
"message_detail": "Some content"
},
"model": "notification",
"pk": 4
},
{
"fields": {
"message": "Test Message",
"message_detail": "Testing testing"
},
"model": "notification",
"pk": 3
}
]
我想在UITableView中填充每个项目的行,只显示字段message
的值,然后我会点击该行以显示包含message
和{{1的新视图值。这些消息可能会在以后保存message_detail
值时更新,因此保留该信息可能很重要。
解析这些数据的最合适和最有效的方法是什么,并将其保留以便下次启动应用程序?
我认为plist是一个好方法,但我想看一些建议,包括一些代码,说明如何最好地从提供的JSON数组中填充UITableView并保留下次启动的数据。 / p>
答案 0 :(得分:2)
假设你有一些类属性:
@interface ViewController ()
@property (nonatomic, strong) NSArray *array;
@end
只需使用NSJSONSerialization
:
NSError *error;
NSData *data = [NSData dataWithContentsOfURL:url];
self.array = [NSJSONSerialization JSONObjectWithData:data
options:0
error:&error];
如果要将数组保存在Documents
文件夹中以便持久存储,以便在将来调用应用程序时进行检索,您可以:
NSString *docsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
NSString *filename = [docsPath stringByAppendingPathComponent:@"results.plist"];
[self.array writeToFile:filename atomically:NO];
稍后在下次调用时从文件中读取它(如果您不想从服务器重新检索它):
NSString *docsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
NSString *filename = [docsPath stringByAppendingPathComponent:@"results.plist"];
self.array = [NSData dataWithContentsOfFile:filename];
要将其用于UITableView
,您可以将其存储在类属性中并响应相应的UITableViewDataSource
方法:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [self.array count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *cellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
NSDictionary *rowData = self.array[indexPath.row];
NSDictionary *fields = rowData[@"fields"];
cell.textLabel.text = fields[@"message"];
cell.detailTextLabel.text = fields[@"message_detail"];
return cell;
}