1

私はUITableViewすべてのセルの画像を持っていますが、すべての画像はすでにセルにあり(私は自分で画像を設定していません)、プロジェクトに含まれている画像からすべてロードされています。これらは、サーバーなどからロードされている画像ではありません。ただし、テーブルビューのスクロールはまだ多少ぎくしゃくしています。それをスピードアップするためにできることはありますか?ここにセルを生成する関数があります:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    // Post init, update with the fair info so it can attend/de-attend on its own
    CompaniesCustomCell *cell = [CompaniesCustomCell dequeOrCreateInTable:tableView];
    SectionInfo *sectionInfo = [sectionInfoArray objectAtIndex:indexPath.section];
    cell.fairDictionary = [sectionInfo.arrMDetails objectAtIndex:indexPath.row];
    [cell updateEventIcon:(NSString*)[[sectionInfo.arrMDetails objectAtIndex:indexPath.row] valueForKey:@"TYPE"]];

    cell.lblFairName.text = [[sectionInfo.arrMDetails objectAtIndex:indexPath.row] valueForKey:@"TITLE"];
    [cell setSelectionStyle:UITableViewCellSelectionStyleNone];

    // Set event start time, end time, and date
    NSString *newDate = [MyUtil convertToLocalTime:@"MMMM dd, yyyy" :[[sectionInfo.arrMDetails objectAtIndex:indexPath.row] valueForKey:@"START_TIME"]];        
    NSString *startString = [MyUtil convertToLocalTime:@"hh:mm a" :[[sectionInfo.arrMDetails objectAtIndex:indexPath.row] valueForKey:@"START_TIME"]];
    NSString *endString = [MyUtil convertToLocalTime:@"hh:mm a" :[[sectionInfo.arrMDetails objectAtIndex:indexPath.row] valueForKey:@"END_TIME"]];

    cell.lblFairDate.text = newDate;
    cell.lblFairStartTime.text = startString;
    cell.lblFairEndTime.text = endString;
    return cell;
}

それを遅くする可能性のある私が間違っていることはありますか?

編集

convertToLocalTimeこれが根本的な原因である可能性があるため、ここに関数のコードを含めています。しかし...私はそれを最適化する方法を本当に混乱しています。サーバーからタイムスタンプ値(UTC)を取得し、それをユーザーのローカルタイムゾーンに変換しています。このプロセスは本当に遅いですか?

// Converts given time string into the users current timezone
// based on the location of their phone
+(NSString *)convertToLocalTime:(NSString*)format :(NSString*)stringDate {

    // Get the date in the servers time zone
    NSDate *date = [MyUtil convertToServerDate:stringDate];

    // Convert the date to the local timezone
    NSDateFormatter *localFormat = [[NSDateFormatter alloc] init];
    [localFormat setDateFormat:format];
    NSString *localDate = [localFormat stringFromDate:date];

    [localFormat release];
    return localDate;
}

// Provides a NSDate object with the servers timezone set
+(NSDate *)convertToServerDate:(NSString*)stringDate {

    // First get the NSDate object in the servers timezone
    NSTimeZone *tz = [NSTimeZone timeZoneWithName:ServerTimezone];
    NSDateFormatter *inFormat = [[NSDateFormatter alloc] init];
    [inFormat setDateFormat:@"yyyyMMddHHmmss"];
    [inFormat setTimeZone:tz];
    NSDate *date = [inFormat dateFromString:stringDate];

    [inFormat release];
    return date;
}
4

3 に答える 3

2

EarlyRiserが言ったように、日付ユーティリティコードを確認してください。ただし、これはクラスメソッドであるため、新しいオブジェクトを作成する必要があります。

もう1つ試すことは、カスタムセルクラスにラベルを変更させることです。これは、fairDictionaryを設定したときから実行できます。カスタムセルの.hのfairDictionaryで@propertyを使用したと仮定しました。

カスタムセルの.mで、fairDictionaryのsetメソッドを上書きして、@synthesizeの上部で次のようにします。

@synthesize fairDictionary = _fairDictionary;

次に、.mファイルのどこかでメソッドを呼び出します。

- (void)setFairDictionary:(NSDictionary *)fairDictionary {
_fairDictionary = fairDictionary;
[cell updateEventIcon:(NSString*)[_fairDictionary valueForKey:@"TYPE"];
self.lblFairName.text = [_fairDictionary valueForKey:@"TITLE"];

などなど。したがって、タイトルなどを設定するテーブルデータソース処理の代わりに、カスタムクラスがディクショナリの設定でそれを行います。

これがお役に立てば幸いです。

于 2012-10-25T15:41:35.653 に答える
1

私は最近かなりの量のUITableView最適化を行いました、そしてあなたの親友はタイムプロファイラーツールです。使い方がわからない場合は、学ぶ必要があります。これは命の恩人です。

これがチュートリアルです

確認したいことの1つは、日付ユーティリティコードです。それはその中で何をしますか?呼び出すたびにNSCalendarオブジェクトを作成していますか?これはあなたのパフォーマンスを殺すのに十分かもしれません。しかし、プロファイリングなしで知るのは本当に難しいです。

于 2012-10-25T04:02:16.910 に答える
1

私はこの問題にかなり苦労しているので、あなたの問題をよく知っています。UITableViewはぎくしゃくしていますか?すべての答えが日付関数を指していることに驚いています。あなたはそれをすべて取り除くことができます、そしてそれはまだぎくしゃくします。

なんで?それは怠惰な画像解凍です。すべての画像がアプリバンドルからのものであっても、iOSは画面に表示される瞬間に解凍を実行します。バックグラウンドスレッドで画像を手動で解凍する必要があります。

解凍は、UIImageオブジェクトをインスタンス化することを単に意味するのではありません。多少複雑になる可能性があります。最善の解決策は、SDWebImageをダウンロードし、付属のイメージデコンプレッサを使用することです。

この問題の詳細については、http://www.cocoanetics.com/2011/10/avoiding-image-decompression-sickness/を参照してください。

于 2013-02-16T08:23:14.957 に答える