2011-03-30 125 views
2

我试图从URL加载的drawRect:内的图像。我们的图像加载代码看起来像这样的方法:- (void) loadImage:(NSURL*)url done:(void(^)(UIImage*))done;,这将创建一个异步NSURLConnection的和回调与图像。使用GCD /异步代码:

所以,我在drawRect:代码如下所示:

CGContextRef context = UIGraphicsGetCurrentContext() 
[service loadImage:url done:^(UIImage * image){ 
    CGContextDrawImage(context, frame, image.CGImage); 
}]; 

不幸的是,这是行不通的。图像从未绘制。

我也试着使用同步连接([NSData dataWithContentsOfUrl:]),但块的线程和不必要的会减慢速度。我不想使用UIImageView。

这样做的正确方法是什么?谢谢!

+0

请让我们知道您是如何解决这个问题,我坚持了同样的问题。谢谢 – Vjy 2012-03-31 03:15:51

回答

3

我认为正确的方法是预先加载图像或通过调用“setNeedsDisplayInRect:”或通过单独的方法进行自己的图形处理来接收图像,然后绘制图像(iOS可能会阻止您尽管这样做,我不知道)。很明显,setNeedsDisplayInRect变体会要求你手头有图像以便第二次绘制(缓存)。

如果你异步加载图像,你的drawRect方法在图像加载前很可能已经退出,并且绘图焦点不再锁定在drawRect上,因此无法在上下文中绘制图像。你有没有尝试设置一个断点来验证这一点?我对锁定可能是错误的,但是我认为我在某个时候读了类似的东西。

0

我想尝试的第一件事是确保异步处理在主线程上运行:

[service loadImage:url done:^(UIImage * image) { 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     CGContextDrawImage(context, frame, image.CGImage); 
    }); 
}]; 

如果这样做没有帮助,我就开始怀疑,如果上下文仍然有效。指针是,但上下文可能不是。也许你可以在上下文获取移动到处理程序:

[service loadImage:url done:^(UIImage * image) { 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     CGContextRef context = UIGraphicsGetCurrentContext(); 
     CGContextDrawImage(context, frame, image.CGImage); 
     … 
    }); 
}]; 

不知道如果是有道理的API明智的,我没有做很多这样的东西。

+0

不行,恐怕。谢谢!其他海报是正确的,以后没有有效的上下文可用。 – 2011-03-31 13:28:14

3

认为它通过 - 为什么它运行?有没有保证context仍然是进入语句块时的当前上下文(甚至其后备存储仍然是完全有效)。通过使用异步回调,无论是块还是委托方法或其他方法,您都有意将代码推迟到以后的某个时间点。拨打-drawRect:的电话已经结束,并且在您进入电话簿之前就已经关闭。

0

你试过:

__block CGContextRef context = UIGraphicsGetCurrentContext() 
[service loadImage:url done:^(UIImage * image){ 
    CGContextDrawImage(context, frame, image.CGImage); 
}]; 

您可能需要做同样的事情与框架,所以当块返回它知道什么背景和框架应该修改。