Iphone NSO操作主队列问题

Iphone NSO操作主队列问题,iphone,ios,uiimage,nsoperation,nsoperationqueue,Iphone,Ios,Uiimage,Nsoperation,Nsoperationqueue,我有幻灯片,我想显示大图像,我添加了低优先级的[NSOperation mainQueue]操作,此操作显示图像 如果图像很小,一切正常,但当图像约为5Mb时,视图冻结1秒,我无法滚动幻灯片。我认为,显示大图像对iPhone来说太难了,以至于主队列超载 但我不能忍受,因为我所有的显示代码都是在低优先级操作中执行的 这是显示代码 [imageView removeFromSuperview]; imageView = nil; // reset our zoomScale to 1.0 befo

我有幻灯片,我想显示大图像,我添加了低优先级的
[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
?)的常规questure识别器)

更新


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

优先级与日程安排有关。如果您在runloop迭代期间将一组操作排队,那么它们将按照队列上的优先级执行

加快这一速度的一个解决方案是,要么包含按您所显示的确切大小缩放的资源。如果您试图在200x200区域中显示一个2000x2000像素的图像,那么系统将在内存中缩放所有这些内容。您还可以通过编程方式动态创建更小的图像。这可以在后台队列上完成,因此您的UI仍然具有响应性


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

NSOperationQueue* queue = [NSOperationQueue mainQueue];
然后,您添加到其中的任何操作都将在并发的主调度队列上执行(并负责在主线程上执行任务)。这就解释了冻结的原因。您可以创建自己的队列,该队列将为每个NSO操作启动一个线程,并释放主线程以正常呈现UI,如下所示:

NSOperationQueue* queue = [[NSOperationQueue alloc] init];
[queue addOperation:operation];
然而,这将导致一个问题。当图像加载完成并将其传递到屏幕上的UIImageView时,在图像实际呈现之前会有很大的延迟,因为主(UI)线程在选择刷新(几秒钟后)之前不会意识到该操作。解决方案是在NSOperation主方法的末尾添加“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加载到所需的组件