データの出所に関係なくスクロールをスムーズに保つには、別のスレッドでデータをフェッチし、データがメモリにある場合にのみUIを更新する必要があります。グランドセントラルディスパッチは行く方法です。self.photos
これは、画像ファイルへのテキスト参照を含む辞書があることを前提としたスケルトンです。画像のサムネイルは、ライブ辞書に読み込まれる場合と読み込まれない場合があります。ファイルシステムキャッシュにある場合とない場合があります。それ以外の場合は、オンラインストアから取得されます。Core Dataを使用することもできますが、スムーズなスクロールの鍵は、データがどこから来たとしても、データを待たないことです。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Photo Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
//identify the data you are after
id photo = [self.photos objectAtIndex:indexPath.row];
// Configure the cell based on photo id
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//move to an asynchronous thread to fetch your image data
UIImage* thumbnail = //get thumbnail from photo id dictionary (fastest)
if (!thumbnail) { //if it's not in the dictionary
thumbnail = //get it from the cache (slower)
// update the dictionary
if (!thumbnail) { //if it's not in the cache
thumbnail = //fetch it from the (online?) database (slowest)
// update cache and dictionary
}
}
}
if (thumbnail) {
dispatch_async(dispatch_get_main_queue(), ^{
//return to the main thread to update the UI
if ([[tableView indexPathsForVisibleRows] containsObject:indexPath]) {
//check that the relevant data is still required
UITableViewCell * correctCell = [self.tableView cellForRowAtIndexPath:indexPath];
//get the correct cell (it might have changed)
[[correctCell imageView] setImage:thumbnail];
[correctCell setNeedsLayout];
}
});
}
});
return cell;
}
ある種のシングルトンイメージストアマネージャーを使用している場合は、マネージャーがキャッシュ/データベースアクセスの詳細を処理することを期待します。これにより、この例が簡略化されます。
この部分
UIImage* thumbnail = //get thumbnail from photo id dictionary (fastest)
if (!thumbnail) { //if it's not in the dictionary
thumbnail = //get it from the cache (slower)
// update the dictionary
if (!thumbnail) { //if it's not in the cache
thumbnail = //fetch it from the (online?) database (slowest)
// update cache and dictionary
}
}
次のようなものに置き換えられます
UIImage* thumbnail = [[ImageManager singleton] getImage];
(メインキューに戻ったときにGCDで効果的に提供しているため、完了ブロックは使用しません)