10

何千行も何も話していませんが、物事をこれほど高くスケールアップする方法があれば、私はそれが大好きです。

27セクションと180行がすべてのセクションに分散しているテーブルがあり、現在行き詰まっているシナリオは、3セクションと5行だけのモデル状態にアニメーション化し、(さらに悪いことに)再び元に戻す場合です。

beginUpdates/endUpdatesを使用してすべてのアニメーションをバッチ処理しています。私のアプリは、iphone4で1〜2秒間ロックされ、問題が解決されてから、アニメーションが開始されます。

私は、各行の削除/追加をアニメーション化すること、セクションを維持すること(および削除の場合は行数を0に落とすこと)、およびセクション自体の削除/挿入だけをアニメーション化すること(行数が0に低下しました)。後者の方がパフォーマンスが良いと思いましたが、まったく変わりませんでした。

これをスピードアップするためにアプリ側でできることはありますか?現在、アニメーションが20を超える場合は、個々のアニメーションを回避するためのかなり大まかなコードがあり、代わりにreloadDataを選択しています。

問題を示すコードをここで編集します。このコードのパフォーマンスは、同等のモノタッチコード(以前使用していたもの)よりもわずかに優れていますが、それでもかなり悪いです。

#import "TableViewController.h"

@interface MyTableViewDataSource : NSObject<UITableViewDataSource> {
    int rows;
};

@end

@implementation MyTableViewDataSource

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (void)setRowCount:(int)r
{
    rows = r;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return rows;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (!cell)
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

    cell.textLabel.text = [NSString stringWithFormat:@"row %d", indexPath.row];

    return cell;
}

@end

@implementation MyTableViewController {
    UIBarButtonItem *populateButtonItem;
};

- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
    if (self) {
        populateButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Populate" style:UIBarButtonItemStylePlain target:self action:@selector(populateDataSource)];
    }
    return self;
}

- (void)populateDataSource
{
    NSMutableArray* new_rows = [[NSMutableArray alloc] init];
    [((MyTableViewDataSource*)self.tableView.dataSource) setRowCount:200];

    for (int i = 0; i < 200; i ++)
        [new_rows addObject:[NSIndexPath indexPathForRow:i inSection:0]];

    [self.tableView beginUpdates];
    [self.tableView insertRowsAtIndexPaths:new_rows withRowAnimation:UITableViewRowAnimationAutomatic];
    [self.tableView endUpdates];
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.tableView.dataSource = [[MyTableViewDataSource alloc] init];
    self.navigationItem.rightBarButtonItem = populateButtonItem;
}

@end
4

3 に答える 3

3

表示されている行をアニメーション化することだけが理にかなっています。挿入するすべての行に対してアニメーションを実行する代わりに、表示される行の挿入だけをアニメーション化することを検討してください。

また、遅延の原因がアニメーションであると確信していますか? アニメーションに合格した場合、同じ遅延UITableViewRowAnimationNoneが発生しますか?それともより高速ですか? より高速な場合は、表示されない挿入をアニメーション化しないでください。( を使用して、現在どの行が表示されているかを把握できます-indexPathsForVisibleRows。) 速度が速くない場合、問題はおそらくアニメーションとはまったく関係がなく、数百行を一度に挿入するオーバーヘッドが原因です。現在行っているようにテーブル全体をリロードすることも 1 つのオプションです。行を小さなバッチに挿入することも別の方法です。

最後に、挿入中に Instruments を使用してアプリのプロファイルを作成することをお勧めします。その遅延中にアプリが何をしているかをよりよく理解できます。これが遅延をなくすための第一歩です。

于 2012-05-14T15:25:12.947 に答える
1

(参照: テーブル ビューは、適切なアニメーション スタイルを選択しますUITableViewRowAnimationAutomatic。(iOS 5.0 で導入されました。)) を使用していますが、何らかの理由で、テーブル ビューは非常に悪いものを選択し、展開中にすべての行がフェードインします。UIViewsフレームのサイズを変更して移動しながら200 で不透明度を変更すると、処理が遅くなります。:)

これを行うことができます:

[self.tableView insertRowsAtIndexPaths:new_rows withRowAnimation:UITableViewRowAnimationNone];

これにより、行を挿入する際のアニメーションが UITableView の非常に基本的なアニメーションに縮小されます。私の意見では、行を挿入する際にはこれで十分です。

于 2012-05-10T14:04:52.773 に答える
0

ハードコーディングされた文字列の配列で同じ機能をテストしてみて、問題がなくなったことを確認してください。問題が解決しない場合は、データではなくレンダリングに問題があることを意味します。

さまざまな種類のアニメーション用に、優れたワンライナー実装でより高速なアニメーションを実現できるカスタム コントロールが既にいくつか作成されています。こちらをご覧ください。

于 2012-05-09T05:37:13.500 に答える