gpt4 book ai didi

ios - 在后台绘图

转载 作者:行者123 更新时间:2023-11-29 12:51:28 25 4
gpt4 key购买 nike

我有一个 IOS 应用程序需要更新 View 以响应用户或外部事件。绘制时间可以很短也可以很长(几秒),具体取决于 View 中的内容。

现在,绘图发生在 View 的 drawRect 方法中当绘图很长并且有很多用户交互时,应用会变得无响应。

当它需要更新时,整个 View 都需要更新。如果在绘制过程中发生更改,重新开始绘制以考虑更改是有意义的。

我想在后台进行绘图。

我的问题是在 IOS 中执行此操作的最佳机制是什么?

线程,NSOperation?

我如何处理图纸?例如,如何在我正在更新的 View 的线程中获取图形上下文?

绘图操作应该如何启动?现在我正在做 setNeedsDisplay。我可以改变去做其他事情。

有问题的 View 在 UIScrollView 中,但没有其他用户交互。

最佳答案

这是一个可以开始的框架。代码假定输出 View 是 UIImageView。后台任务使用位图内存上下文为输出 View 创建新图像。当后台绘制任务完成时,主线程将生成的图像分配给 UIImageView。

sequenceNumber 用于在绘制完成之前丢弃过时的图像。一个可能的问题是事件到达得太快以至于每个图像在完成之前就已经过时了。解决这个问题留给读者作为练习。

@interface SomeClass()
@property (weak, nonatomic) IBOutlet UIImageView *someView;
@property (nonatomic) int64_t sequenceNumber;
@end

@implementation SomeClass

- (UIImage *)createImageUsingBitmapMemoryContextOfSize:(CGSize)size
{
// create the memory bitmap context
UIGraphicsBeginImageContext( size );
CGContextRef context = UIGraphicsGetCurrentContext();

// draw something
[[UIColor blueColor] set];
CGContextFillEllipseInRect( context, CGRectMake(0, 0, size.width, size.height) );

// create a UIImage
UIImage *result = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

// return the image
return( result );
}

// Note: the following function should only be called on the main thread
- (void)updateInResponseToSomeEvent
{
self.sequenceNumber++;
int64_t sequenceNumber = self.sequenceNumber;

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^
{
UIImage *image = [self createImageUsingBitmapMemoryContextOfSize:self.someView.bounds.size];
dispatch_async( dispatch_get_main_queue(), ^
{
if ( sequenceNumber == self.sequenceNumber )
self.someView.image = image;
});
});
}

关于ios - 在后台绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22338727/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com