0

データを保存して送信するための「正しい」アプローチは何でしょうか。たとえば、JSONを受け取ります。その構造は次のようなものです。

  {
    id = 1;
    country_id = 298;
    date = "2012-11-08 14:00:36";
    name = "Mr. Blank";
    profile = "http://somewhere.com/user1234/profile.png";
  }

これで、tableViewができました。ここで、CustomCellにプロファイルの写真、名前、国IDを表示します。クリックすると、詳細ビ​​ューに移行します。ここで、プロフィール写真と、彼のIDに基づくその他の情報(基本的には新しいAPI呼び出し)が再び表示されます。

ここで、この最初のJSONを受け取ったら、idやprofilepicなどの値を保存して送信する方法を検討する必要があります。

私は2つのアプローチを知っていますが、それらが「正しい」かどうかはわかりません。1つ目は、jsonが到着したらすぐにすべてを配列に保存することです。こんな感じです

NSMutableArray *idArr = [[NSMutableArray alloc]init];
NSMutableArray *picArr = [[NSMutableArray alloc]init];

    for (NSDictionary *recDict in jsonResults)
        {
            NSString *personsID = [recDict objectForKey:@"id"];
            [idArr addObject:personsID];
            NSString *pic = [recDict objectForKey:@"profile"];
            [picArr addObject:pic];

        }

このメソッドは機能しますが、JSONで取得したものすべてを常に配列に保存します。そのため、行が多い場合は時間がかかります(特に画像が大きい場合)。非同期でロードすることが解決策になるかもしれないことは知っていますが、ここで原理について話したいと思います。

別の方法は、選択したセルから直接値を渡すことです。つまり、メソッドdidSelectRowAtIndexPathで実行します

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
        MyCustomCell *cell = (MyCustomCell *)[tableView cellForRowAtIndexPath:indexPath];
    imageToSend = cell.profilePic.image; //we have UIImage *imageToSend;
    idToSend = cell.idLabel.text; //we have NSString *idToSend;
    [self performSegueWithIdentifier:@"showDetail" sender:self];
}

このアプローチの利点は、tableViewがデフォルトで「lazyload」を使用する(つまり、ユーザーが下にスクロールするとセルをロードする)ため、最初のアプローチと比較して時間を節約できることです。

値を渡す方法について、いくつかの洞察を教えてください。prepareForSegueメソッドを使用する必要があることはわかっていますが、そこにindexPath.rowにアクセスすることはできません。(つまり、そのセグエがどこから呼び出されているかを特定できます)

4

1 に答える 1

1

私は2番目の方が好きです。すべての画像を保存する必要はなく、URLだけを保存する必要があります。画像は非同期で読み込まれる必要があり(私はEGOImageLoadingを使用します)、画像またはURLを新しいビューに送信できます。

tableView indexPathForSelectedRowを使用して、その行からデータを渡すことができます。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    NSIndexPath *path = [self.tableView indexPathForSelectedRow];
    YourObject *yourObject = [objectsArray objectAtIndex:path.row];
    [segue.destinationViewController setObject:yourObject];
}
于 2012-12-12T17:56:32.707 に答える