私が行っていることの簡単な説明:2つの配列があり、どちらにもテーブルビューの情報の50%が含まれています。なんで?アレイの1つはインターネットから現在の情報を取得し、もう1つのアレイはユーザーデータを保存しているためです。私はObjective-Cのアマチュアであり、Objective-Cでのネットワーキングは言うまでもなく、面倒な方法でインターネットから現在の情報を取得する方法についてはわかりませんでした。とにかく、インターネットアレイは、AFNetworkingを使用して、保存されたアレイ(コアデータに保存された)内のオブジェクトに対応する情報を取得しています。したがって、それは非同期であり、私はそれを望んでいます。ここで問題が発生します。少なくとも、状況から何を得ることができるかです。
保存された配列内のオブジェクトを効果的にカウントし、各オブジェクトの一意のIDを渡すforループを実行しているため、インターネットからの対応する情報をダウンロード、解析、およびインターネット配列に追加できます。ただし、ネットワークは非同期であるため、ループはインターネットからすべての情報を一度に効果的にダウンロードしています。したがって、オブジェクトはインターネットアレイに書き込まれ、最初にダウンロードされた順になります。したがって、savedArray[0]はinternetArray[0]のオブジェクトに対応していません。これはご想像のとおり、かなり大きな欠陥です。tableViewに値を挿入するとき、実際に一致するものや意味のあるものはありません。
前回のダウンロードが完了してinternetArrayに追加されるまで、情報のダウンロードを延期する方法を本当に探しています。一体どうすればよいですか?次に、コードについて説明します。ここで適切なキーを取得します。
for ( int i = 0; i < [mySavedObjects count]; i++) {
MySavedObject* mySavedObject = [mySavedObjects objectAtIndex:i];
[self retrieveMissingInformation: myObject.Id];
[self.tableView reloadData];
}
そして、ここで私は実際に情報を取得します(スペースのために簡略化されています):
- (void)retrieveMissingInformation:(NSString *) Id
{
// create URL here.
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request
success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
NSLog(@"Success");
// Do some safety checks & parse the JSON, returning a searchResult.
[searchResults addObject:searchResult];
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON)
// Do some error messages etc.
}];
[queue addOperation:operation]; //where queue is an ivar NSOperationQueue.
}
最後に、cellForRowAtIndexpathで、これらは両方を使用します。
MySavedObject *mySavedObject = [mySavedObjects objectAtIndex:indexPath.row];
&
SearchResult *searchResult = [searchResults objectAtIndex:indexPath.row];
セルの値を取得します。
非常に大きなテキストの壁でごめんなさい。私は物事を効率的に説明するのに十分ではなく、しばしば用語に舌を巻かれ、自分の例を作ることに頼らなければなりません。この混乱を注文するのに助けがあれば、私は本当に感謝しています。
よろしく、
マイク。