我正在尝试编写一个屏幕保护程序,从我的网站加载图像并以随机顺序显示它们。我的 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()
了相同的结果。非常感谢任何帮助。