1

スライドショーがあり、大きな画像を表示したいのですが、[NSOperation mainQueue]優先度の低い操作に追加しました。この操作で画像が表示されます。

画像が小さい場合はすべて問題ありませんが、画像が約5Mbの場合、ビューが1秒間フリーズし、スライドショーをスクロールできません。iPhoneでは大きな画像を表示するのが非常に難しいので、メインキューが過負荷になっていると思います。

しかし、私の表示コードはすべて優先度の低い操作で実行されるため、私はそれを理解していません。

これが表示コードです。

[imageView removeFromSuperview];
imageView = nil;

// reset our zoomScale to 1.0 before doing any further calculations
self.zoomScale = 1.0;

// make a new UIImageView for the new image
self.imageView = [[[UIImageView alloc] initWithImage:image] autorelease];
[self addSubview:imageView];

self.contentSize = [image size];
[self setMaxMinZoomScalesForCurrentBounds];
self.zoomScale = self.minimumZoomScale;

ジェスチャレコグナイザー(?の通常のクエストレコグナイザー)の優先順位を設定できる可能性がありUIScrollViewます

アップデート

私の新しいトピックを見てください、私は問題をより適切に説明しました私のトピック

4

2 に答える 2

3

優先順位はスケジューリングに関係しています。runloop の反復中に一連の操作をキューに入れると、それらはそのキューの優先度に従って実行されます。

これを高速化する 1 つの解決策は、表示する正確なサイズにスケーリングされたリソースを含めることです。2000x2000 ピクセルの画像を 200x200 領域に表示しようとしている場合、システムはメモリ内のこれらすべてのものをスケーリングします。 . プログラムを使用して、サイズに合わせて小さい画像を動的に作成することもできます。これはバックグラウンド キューで実行できるため、UI は引き続き応答します。

iphoneのobjective-cでプログラムで画像のサイズを変更する方法

于 2012-06-22T14:42:59.397 に答える
0

私があなたの正しさを理解し、あなたが次のようなことをした場合

NSOperationQueue* queue = [NSOperationQueue mainQueue];

次に、それに追加する NSOperation は、メイン ディスパッチ キューで実行されます。これは、並行している (メイン スレッドでのタスクの実行を担当します)。それはフリーズを説明するでしょう。すべての NSOperation に対してスレッドを開始し、メイン スレッドを解放して通常どおり UI をレンダリングする独自のキューを作成できます。

NSOperationQueue* queue = [[NSOperationQueue alloc] init];
[queue addOperation:operation];

ただし、これは問題を引き起こします。画像の読み込みが完了し、画面上の UIImageView に渡すと、画像が実際にレンダリングされるまで大きな遅延が発生します。これは、メイン (UI) スレッドが更新を選択するまでアクションを認識しないためです (いくつかの秒後)。これに対する解決策は、次のように NSOperation のメイン メソッドの最後に「performInMainThread」メッセージを追加することです。

-(void)main {
    NSData *bgImageData = [NSData dataWithContentsOfURL:self.targetUrl];
    UIImage *img = [UIImage imageWithData:bgImageData];
    [self performSelectorOnMainThread:@selector(insertImageLoaded:)
                           withObject:img
                        waitUntilDone:YES];
}

「insertImageLoaded」は NSOperation にあり、必要なコンポーネントに setImage:(UIImage*)img を呼び出します。

于 2012-11-20T16:01:46.740 に答える