我正在尝试编写一个屏幕保护程序,用于从我的网站加载图像并以随机顺序显示它们。随机性和图像获取由我的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;
}
在这里,我试图触发在单独队列中获取图像和标题的功能。然后在原始视图上绘制图像,但这是问题。
每当在首选项面板中选择最终的screenviewer插件时,图像将在首选项面板的视图(而不是黑色预览矩形)上绘制。同样,在预览屏幕保护程序时,不会绘制图像,但每当我退出屏幕保护程序时,首选项面板的视图都会被图像覆盖。
在我看来,图像总是被加载和绘制,但不是在正确的队列/上下文中?我没有使用变量queue
,而是使用了dispatch_get_main_queue()
相同的结果。非常感谢任何帮助。
答案 0 :(得分:0)
您的线程似乎没有任何问题。这是问题的绘图。
您的绘图调用没有上下文。 drawInRect
是需要图形上下文的Quartz函数。通常它用于NSView
的绘图方法。
您应该将要绘制的视图子类化,并为其提供类似updateWithImage:(NSImage*)image
的方法,以便正确绘制图形。然后在主线程上调用该方法。
dispatch_sync(dispatch_get_main_queue(), ^{
[theCorrectView updateWithImage:image];
});
答案 1 :(得分:0)
尝试将绘图代码放到overriden超级视图的drawRect函数中。然后拨打
[self setNeedsDisplay];
在主队列上。它将安排一个新的drawRect:(CGRect)调用。
答案 2 :(得分:0)
我知道这不是你要找的答案,但也许有帮助。我的创业公司正在构建一个可以显示网页的屏幕保护程序,它被称为Screensaver Ninja,因此,如果您使用jQuery或任何其他常用网络技术开发一个可以执行您想要的页面并只显示它。您可以在https://screensaver.ninja找到更多信息。