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()
どんな助けでも大歓迎です。