什么方法实际执行GUI操作?

时间:2011-03-19 05:04:39

标签: iphone user-interface

我正在开发一个网络服务数据处理应用程序,我正在努力让应用程序尽快运行。当执行某个3指平移手势时,我调用一种方法,将更新后的信息发送到服务器,以获取新的一批图像,以更新现有的图像。

所以,让我们说一个阵列中有15个图像,我用2个手指过滤它们,然后如果我想改变它们的某些东西,我可以做3个手指的姿势,然后我得到同样的设置,稍微调整一下(对比度/亮度等)。

我想要的是能够在检索到第一张图像后更新显示图像的imageView,以便让用户了解系列中其余部分的外观。但无论我尝试什么,无论我尝试和实现多少个不同的线程,我都无法在整个下载完成之前更新imageView。批量下载完成后(在单独的线程上处理),imageView将使用新图像进行更新,一切都很棒。

这个过程的第一步是:

if(UIGestureRecognizerStateEnded == [recognize state]){
    [self preDownload:windowCounter Level:levelCounter ForPane:tagNumber];// Where this method is what gets the first image, and tries to set it to the imageView
    [self downloadAllImagesWithWL:windowCounter Level:levelCounter ForPane:tagNumber]; //And this method goes and gets all the rest of the images
}

这是我的预下载方法:

-(void)preDownload:(int)window Level:(int)level ForPane:(int) pane{

int guidIndex = [[globalGuids objectAtIndex:pane] intValue];

UIImage *img = [DATA_CONNECTION getImageWithSeriesGUID:[guids objectAtIndex:guidIndex] ImageID:counter Window:window Level:level];

if(pane==0){
    NSLog(@"0");
    [imageView3 setImage:img];
}else if(pane==1){
    NSLog(@"1");
    [imageView31 setImage:img];
}else if(pane==2){
    NSLog(@"2");
    [imageView32 setImage:img];
}else if(pane==3){
    NSLog(@"3");
    [imageView33 setImage:img];
}



   }

所以通过将它分成两个不同的方法(此时没有实现任何线程,这些方法在所有之前被调用)我认为在preDownload方法完成之后,imageView会更新,然后控制将继续下载到downloadAllImagesWithWL方法,但似乎并非如此。

我在这里错过了一些简单的东西吗?在第二种方法运行之前,我该怎么做才能更新我的GUI元素?

2 个答案:

答案 0 :(得分:0)

设置图像后,图像视图会将自身标记为需要显示。直到下一个运行循环开始时才会显示实际显示。在OS X中,您可以使用-display立即绘制视图,但我不认为Apple在iOS上创建了一个公共方法来执行此操作。但是,如果下一个方法只是创建后台线程,那么它将快速返回并且显示更新可能会在线程完成之前发生。

答案 1 :(得分:0)

你是对的。但是,在代码到达runloop之前,viewn不会刷新。你可以做两件事:

  • 让你的downloadAllImagesWithWL方法异步,所以它会在你调用之后返回,你的主线程到达runloop,gui更新,下载方法会在完成后通过回调告诉你的逻辑。

OR

  • 一个简单的hackier(和坏)解决方案是在调用下载方法之前运行runloop一段时间。像这样:[[NSRunloop currentRunLoop] runUnitlDate:[Date dateWithTimeIntervalSinceNow:0.1]];它将运行runloop 0.1秒。