1

複数列のtableViewを使用しました!1つの画面に16個のセルがあり、3000個のデータがあり、データベースからサムネイル画像を取得した場合(オープンソースのFMDBを使用します)、このテーブルをロードするときにスレッドを1つだけ開きますサムネイルをダウンロードしてデータベースに保存します。

セルが表示されると、ダウンロードされていれば、db からサムネイルを取得しました。しかし、データベースからデータを取得するのが非常に遅く、1つのセルで約0.15〜1.3秒であることがわかりました.1つの画面に16個のセルがあります。それで、それは私のメインスレッドをブロックしますか?

問題の解決に役立つ提案はありますか?

前もって感謝します。

これはサムネイルを取得するコードです〜

   -(NSData *)queryVideoSmallThumbnailData:(NSString *)theSourceUrl
    {
        if(theSourceUrl == nil)
            return nil;
    NSString *query = @"SELECT SMALL_THUMBNAIL_DATA FROM FIELDS WHERE SOURCE_URL";
    query = [query stringByAppendingString:@"=\""];
    query = [query stringByAppendingString:theSourceUrl];
    query = [query stringByAppendingString:@"\""];

    NSData * data = nil;

    FMResultSet *rs = [database executeQuery:query];
    while ([rs next]) 
    {
    data = [rs dataForColumn:@"SMALL_THUMBNAIL_DATA"];
    break;
    }

    [rs close];

    return data;
    }

これは、テーブル ビューの更新イメージ コードです。

    image = [thumbCache getThumbFromCache:record.sourceUrl]
     if (image == nil)
        {
            DBVideoThumb *thumbDB = [[DBManager getInstance] getDBVideoThumb];
            NSData *data = [thumbDB queryVideoSmallThumbnailData:record.sourceUrl];
            image = [UIImage imageWithData:data];
            if (image != nil)
                [thumbCache addThumbToCache:record.sourceUrl image:image];
        }
4

4 に答える 4

1

このFMDBを使用している場合は、手順を (再) 読むことをお勧めします。著者は、複数のスレッドで FMBD の単一のインスタンスを使用するのは悪い考えだと指摘しています。これは、データの整合性を維持する必要があるものすべてに共通の問題です。

FMDB を使用していると仮定して、各スレッドに 1 つずつ、同じストアに FMDB の複数のインスタンスを作成しようとしましたか? これは、非同期ブロック内で、ここに投稿された他の回答に適用できます。完了したら各インスタンスを閉じることを忘れずに、データベースにロックがかかっていることを確認して、アトミックな書き込みを確実に行ってください。

他のソリューションを受け入れている場合、保持したいオブジェクト グラフをモデル化している場合は、コア データが役立つ可能性があります。

于 2013-08-12T05:58:03.173 に答える
1

データベースのサイズは、クエリの速度に影響する場合があります。そのため、テーブル ビューをドラッグすると、サムネイルを小さいものに変更できます。ぼやけたもの、できるだけ小さく。

クエリ速度を n から log2 n に改善できるように、データベースのインデックスを作成します。例:フィールド(url)にインデックスurlIndexを作成します。

于 2013-08-12T05:49:14.777 に答える
0

[UIImage imageWithData:filename] が原因ではないかと思います。私が信じているように、そのパフォーマンスは imageNamed: よりもはるかに低いです。または imagewithContentOfFile:。私の解決策は、別のスレッドでファイルとして保存し、保存後にメインスレッドで表示することです。ビデオが変更されていない場合、次回はクエリデータベースなしでファイルを直接表示します。

于 2013-08-12T06:01:56.560 に答える
0

アプリの開発中に同じ問題に直面しましたが、次のコードを使用してこの問題を解決しました。その助けになるかもしれません。問題が発生した場合はお知らせください。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^(void) {

      NSData *imageData ;

      imageData = [UICommonUtils imageDataFromString:profile.Photo];

      dispatch_sync(dispatch_get_main_queue(), ^(void) {

           if([imageData length] > 1) {

              cell.ProfileImage.image = [UIImage imageWithData:imageData];

            } else {

               cell.ProfileImage.image = [UIImage imageNamed:kDefaultProfileImage];

            }
       });

      imageData = nil;
});
于 2013-08-10T06:55:00.107 に答える