データを保存して送信するための「正しい」アプローチは何でしょうか。たとえば、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にアクセスすることはできません。(つまり、そのセグエがどこから呼び出されているかを特定できます)