0

ページングが有効になっている UIScrollView があり、画像付きの「ページ」を表示したいと考えています。

メインスレッドで最初のページの画像を読み込んで表示します。次に、バックグラウンド スレッドで他のページの画像の読み込みを開始します

    dispatch_async(loadingImagesQueue, ^{
            for (int i = 0; i < numberOfImages; i++) {
                NSString *imagePath = [arrayWithImagePaths objectAtIndex:i];
                UIImage *image = [UIImage imageWithContentsOfFile:imagePath];

                dispatch_async(dispatch_get_main_queue(), ^{
                        NSLog(@"Posting notification\n\n");
                        [[NSNotificationCenter defaultCenter] postNotificationName:NOTIFICATION_NAME_IMAGE_PREPARED object:image];
                });
            }
    });

いくつかのメソッド呼び出しの通知を投稿した後、魔女は読み込まれた画像で新しいページを作成します。

画像の読み込みと新しいページ メソッドの作成にログ メッセージを挿入しました。画像の読み込みに関するメッセージと、新しいページの作成に関するメッセージが 1 つずつ表示されることを期待しています。

しかし、何らかの理由で、最初にすべての画像をロードし、その後で初めて新しいページの作成を開始します。ログメッセージで確認できます。そして最も奇妙なことは、最後の画像の読み込みが終了してから新しいページの作成が開始されるまでに大きな遅延 (約 0.5 秒) があることです。

この奇妙な動作の理由を説明できる人はいますか?

4

1 に答える 1

1

あなたはdispatch_asyncを呼び出しています。メイン キューでその瞬間に通知を実行する場合は、dispatch_sync(dispatch_get_main_queue(), ^{ .... そして、メイン キューに何かをディスパッチするときは、まだメイン スレッドにいないことを確認してください (ここでは、ほとんど安全ですが、一般的には良い習慣です。そうしないと、ロックが発生する可能性があります)。

したがって、完全なコードは次のようになります

if([NSThread isMainThread] == NO){ dispatch_sync(dispatch_get_main_queue(), {....

于 2013-09-27T12:21:50.073 に答える