0

我正在尝试编写一个屏幕保护程序,从我的网站加载图像并以随机顺序显示它们。我的 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

我知道这不是您正在寻找的答案,但也许它会有所帮助。我的创业公司正在构建一个可以显示网页的屏幕保护程序,它被称为Screensaver Ninja,因此,如果您使用 jQuery 或任何其他常用 Web 技术开发一个执行您想要的操作的页面并显示它。您可以在https://screensaver.ninja找到更多信息。

于 2015-04-24T17:06:18.060 回答
0

尝试将绘图代码放到被覆盖的超级视图的 drawRect 函数中。然后打电话

[self setNeedsDisplay];

在主队列上。它将安排一个新的 drawRect:(CGRect) 调用。

于 2013-04-18T20:29:09.580 回答
0

看来你的线程没有问题。问题出在图上。

您的绘图调用没有上下文。drawInRect是需要图形上下文的 Quartz 函数。通常用于 的绘图方法中NSView

您应该将要绘制的视图子类化,并给它一个方法,就像updateWithImage:(NSImage*)image您正确绘制的地方一样。然后在主线程上调用该方法。

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