2

私のアプリケーションでは、 を使用しperformSelectorInBackground:てディスクからイメージをロードしました。dispatch_async を使用した単体テストの後、私は performSelectorInBackground を dispatch_async 呼び出しに置き換えることにしました。

dispatch_queue_t currentBackgroundQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_async(currentBackgroundQueue, ^{
    [self getImageFromDisk:sPath delegate:(id)delegate];
});

コードは機能しているようですが、画像の読み込みが以前より遅くなりました。これにより、ユーザーが画像をスクロールすると黒い画像が表示されます。

私のアプリケーションには、ある種のフォトスクローラーが含まれています。アプリのサイズが非常に大きくなるため、Apple のタイリング サンプル コードを使用できません。このスニペットを使用して、ディスクからイメージをロードします。

4

1 に答える 1

5

以前、他の同様の質問でこれを述べましたが、グローバルキューでディスパッチ非同期を使用すると、特にUIを最終的に更新するコードで同期のような動作が発生します。YMMVですが、試してみると、同期呼び出しとほぼ同じ結果になります。独自のキューを作成して使用するか、(独自のキューを作成して使用して)NSOperationsを使用します。

これは、コードが技術的に非同期であっても、グローバルキューに投稿されたイベントがキューの処理時間を消費するためだと思います。バックグラウンド操作にグローバルキューを使用しないでください。

カスタムキューを使用して、独自の実行ループをポンプします。

于 2012-09-24T08:14:43.297 に答える