0

Web サイトから画像を読み込み、ランダムな順序で表示するスクリーンセーバーをコーディングしようとしています。ランダム性と画像の取得は Web API でカバーされていますが、UI をフリーズせずにダウンロードする方法に本当に行き詰まりました。

現在、私のコードは次のようになっています。

- (void)animateOneFrame
{
    NSRect viewBounds = [self bounds];
    dispatch_queue_t queue = dispatch_get_current_queue();

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        NSImage *image = [self extractImageFrom:@"my_url.com"];
        NSSize imageSize = [image size];            
        NSRect imageRect = NSMakeRect( 0, 0, imageSize.width, imageSize.height );

        dispatch_sync(queue, ^{    
            [image drawInRect:viewBounds fromRect:imageRect operation:NSCompositeCopy fraction:1.0];
        });

    });
    return;
}

ここでは、別のキューで画像とキャプションを取得する関数をトリガーしようとしました。次に、元のビューに画像を描画する必要がありますが、これが問題です。

設定パネルで最後のスクリーンビューアー プラグインを選択すると、画像は設定パネルのビュー (黒いプレビューの四角形ではなく) に描画されます。同様に、スクリーンセーバーをプレビューすると画像は描画されませんが、スクリーンセーバーを終了するたびに設定パネルのビューが画像で覆われます。

画像は常にロードされて描画されているように見えますが、正しいキュー/コンテキストではありませんか? 変数を使用する代わりに、同じ結果でqueue使用しました。dispatch_get_main_queue()どんな助けでも大歓迎です。

4

3 に答える 3

0

これがあなたが探している答えではないことはわかっていますが、役立つかもしれません。私のスタートアップは、Web ページを表示できるスクリーンセーバーを構築しています。これはScreensaver Ninjaと呼ばれ、jQuery やその他の通常の Web テクノロジを使用して必要な処理を行うページを開発し、それを表示するだけです。https://screensaver.ninjaで詳細を確認できます。

于 2015-04-24T17:06:18.060 に答える
0

スレッドに問題はないようです。問題になるのは図面です。

あなたの描画呼び出しにはコンテキストがありません。drawInRectグラフィックコンテキストを必要とする Quartz 関数です。通常、 の描画方法で使用されますNSView

描画先のビューをサブクラス化updateWithImage:(NSImage*)imageし、描画を適切に行う場所のようなメソッドを与える必要があります。次に、メイン スレッドでそのメソッドを呼び出します。

    dispatch_sync(dispatch_get_main_queue(), ^{    
        [theCorrectView updateWithImage:image];
    });
于 2013-04-18T20:25:00.597 に答える