1

注:ARCを使用しています

Web URL から画像を読み込むときに見事に機能する遅延画像読み込み手法があります。ただし、コア データからの画像の読み込みに問題があります。これが私が使用している方法です:

最初に変更可能な配列を初期化して割り当て、コア データからデータをロードしてから、配列に格納します。それから私はこのコードを持っています:

NSOperationQueue *queue = [NSOperationQueue new];
NSInvocationOperation *operation = [[NSInvocationOperation alloc]
                                    initWithTarget:self
                                    selector:@selector(loadImage)
                                    object:nil];
[queue addOperation:operation];

その後...

- (void)loadImage {
    for (int i = 0; i < [myArrayFromCoreData count]; i++) {
        AnObject *myObject = [myArrayFromCoreData objectAtIndex:i];
        UIImage* image;
        if ([myObject.image length] == 0) {
            image = [UIImage imageNamed:@"default.png"];
        }
        else {
            image = [[UIImage alloc] initWithData:myObject.image];
        }
        [self performSelectorOnMainThread:@selector(displayImage:) withObject:[NSArray arrayWithObjects:image,myObject.myObjectId, nil] waitUntilDone:NO];
    }
}

- (void)displayImage:(NSArray*)array {
    [loadedImages setObject:[array objectAtIndex:0] forKey:[array objectAtIndex:1]];
    [self.myTable reloadData];
}

ここまで遅延はなく、NSLog はすべての画像が myObjectLoadedImages 配列に追加されたことを示しています。

私が抱えている問題は、テーブル ビューをスクロールするときにラグがあり、クラッシュすることがあるということです。ロードされた画像を表示するために使用しているコードは次のとおりです。

UIImage* image = [loadedImages objectForKey:myObject.myObjectId];
if (image != NULL) {
    myImageView.image = image;
}
else {
    myImageView.image = [UIImage imageNamed:@"default.png"];
}

これはcellForRowAtIndexPathメソッド内にあるため、セルが表示されるたびに呼び出されます。私のコードは、Web URLから画像を正常にロードしているクラスから適応されているため、ここで間違っていることはありますか?

4

2 に答える 2

0

コアデータに画像パスがあり、画像をUITableViewに表示したいことを理解していますよね?

cellForRowAtIndexPath遅延読み込み部分は、おそらくメソッドで行われるはずです。こちらをご覧ください:役立つブロックを使用してバックグラウンド スレッドから画像を読み込む

基本的にNSFetchedResultsController、コア データからパスを取得するには、 a を使用する必要があります。彼はあなたのためにすべてのキャッシュなどを行います。パスを取得したら、上記のリンクで述べたように画像を遅延ロードします

于 2012-08-07T22:33:25.620 に答える