私はカスタム作業をあまり行わないdrawRect
ので、質問のその部分を他の人に任せますが、通常、テーブルビューのパフォーマンスの問題は、高価な計算をバックグラウンドキューに移動し、メインからセルを非同期に更新することで、はるかに簡単に解決されますそのバックグラウンド操作が実行されたときにキューに入れます。したがって、次のようなものです。
まず、テーブルビューの操作キュープロパティを定義します。
@property (nonatomic, strong) NSOperationQueue *queue;
次に、でviewDidLoad
、これを初期化します。
self.queue = [[NSOperationQueue alloc] init];
self.queue.maxConcurrentOperationQueue = 4;
そして、ではcellForRowAtIndexPath
、次のことができます。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"MyCellIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
// Do the quick, computationally inexpensive stuff first, stuff here.
// Examples might include setting the labels adding/setting various controls
// using any images that you might already have cached, clearing any of the
// image stuff you might be recalculating in the background queue in case you're
// dealing with a dequeued cell, etc.
// Now send the slower stuff to the background queue.
[self.queue addOperationWithBlock:^{
// Do the slower stuff (like complex image processing) here.
// If you're doing caching, update the cache here, too.
// When done with the slow stuff, send the UI update back
// to the main queue...
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
// see if the cell is still visible, and if so ...
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
if (cell)
{
// now update the UI back in the main queue
}
}];
}];
return cell;
}
計算コストの高いものの結果を、のようなものにNSCache
、そしておそらくDocuments
他の場所にもキャッシュすることで、これをさらに最適化できます。したがって、複雑なものを実行する必要がある頻度を最適化し、実際に最適化することができます。 UI。
ちなみに、これを行うと、UILabel
(アルファが0.75の黒にbackgroundColor
使用して)を上に置くことができ、iOSが自動的に処理します。それが得るのと同じくらい簡単です。UIColor
UIImageView
画像の解像度に関する最後の質問では、次のいずれかを行うことができます。
- ビュー
contentScaleFactor
を使用して、網膜を扱っているかどうかを判断し、それに応じてサムネイル画像のサイズを変更します。また
- imageviewを使用するだけ
contentMode
でUIViewContentModeScaleAspectFill
、サムネイル画像が正しくレンダリングされるようになります...小さなサムネイル画像(2倍の画像でも)を使用している場合、パフォーマンスは一般的に良好です。