1

我有幻灯片,我想显示大图像,我添加[NSOperation mainQueue]了低优先级的操作,这个操作显示图像。

如果图像很小,一切正常,但是当图像大约 5Mb 时,视图会冻结 1 秒,并且我无法滚动幻灯片。我认为,对于 iPhone 来说显示大图像非常困难,主队列太超载了。

但我不明白,因为我所有的显示代码都是以低优先级操作执行的。

这是显示代码。

[imageView removeFromSuperview];
imageView = nil;

// reset our zoomScale to 1.0 before doing any further calculations
self.zoomScale = 1.0;

// make a new UIImageView for the new image
self.imageView = [[[UIImageView alloc] initWithImage:image] autorelease];
[self addSubview:imageView];

self.contentSize = [image size];
[self setMaxMinZoomScalesForCurrentBounds];
self.zoomScale = self.minimumZoomScale;

也许我可以设置手势识别器的优先级(常规问题识别器UIScrollView?)

更新

请看我的新话题,我更恰当地描述了这个问题我的话题

4

2 回答 2

3

优先级与调度有关。如果您在 runloop 迭代期间排队一堆操作,那么它们将按其在该队列上的优先级执行。

加快此速度的一种解决方案是包含缩放到您正在显示它们的确切大小的资源。如果您尝试在 200x200 区域中显示 2000x2000 像素图像,那么系统会在内存中缩放所有这些东西. 您还可以以编程方式动态创建更小的图像以适应图像。这可以在后台队列上完成,因此您的 UI 仍然是响应式的。

如何在iphone的objective-c中以编程方式调整图像大小

于 2012-06-22T14:42:59.397 回答
0

如果我理解你的正确性并且你做了类似的事情

NSOperationQueue* queue = [NSOperationQueue mainQueue];

然后,您添加到它的任何 NSOperation 都将在并发的主调度队列上执行(并负责在主线程上执行任务)。这可以解释冻结。您可以创建自己的队列,该队列将为每个 NSOperation 启动一个线程,并释放主线程以正常呈现 UI:

NSOperationQueue* queue = [[NSOperationQueue alloc] init];
[queue addOperation:operation];

然而,这会导致问题。当图像完成加载并将其传递给屏幕上的 UIImageView 时,在实际渲染图像之前会有很大的延迟,因为主(UI)线程在选择刷新之前不会知道该操作(一些几秒钟后)。解决方案是在 NSOperation 的 main 方法的末尾添加一个“performInMainThread”消息,如下所示:

-(void)main {
    NSData *bgImageData = [NSData dataWithContentsOfURL:self.targetUrl];
    UIImage *img = [UIImage imageWithData:bgImageData];
    [self performSelectorOnMainThread:@selector(insertImageLoaded:)
                           withObject:img
                        waitUntilDone:YES];
}

'insertImageLoaded' 在 NSOperation 中,并将调用 setImage:(UIImage*)img 到您想要的组件。

于 2012-11-20T16:01:46.740 回答