0

私のサーバーは、次のように 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を含む新しいビューを表示します。これらのメッセージは、値が保持される後日更新される可能性があるため、その情報を保持することがおそらく重要です。messagemessage_detailpk

このデータを解析して永続化し、アプリの次の起動まで残すための最も適切で効率的な方法は何ですか?

plist は良い方法だと思いますが、提供された JSON 配列から UITableView にデータを入力し、次の起動のためにデータを保持するための最良の方法に関するコードを含むいくつかの提案を見たいと思います。

4

1 に答える 1

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;
}
于 2013-02-05T13:36:28.057 に答える