2011-03-19 67 views
0

我正在研究一個網絡服務數據處理應用程序,我試圖讓應用程序儘可能快地運行。當執行某個3指手勢手勢時,我調用一種方法,將更新的信息發送到服務器以獲取新批次的圖像,以更新現有的圖像。什麼時候實際執行方法GUI操作?

所以我們可以說數組中有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 
} 

這是我的preDownload方法:

-(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元素?

回答

0

你說得對。然而,viewn不會刷新,直到你的代碼達到runloop。你可以做兩件事情:

  • 讓您downloadAllImagesWithWL方法異步,所以它會回報你叫後,你的主線程達到runloop,GUI更新和下載方法將通過回調告訴你的邏輯,當對其做。

OR

  • 一個simplier hackier(壞)的解決辦法是給你打電話你的下載方法之前運行runloop一段時間。就像這樣:[[NSRunloop currentRunLoop] runUnitlDate:[Date dateWithTimeIntervalSinceNow:0.1]];它將運行0.1秒的runloop。
0

設置圖像後,圖像視圖會將自身標記爲需要顯示。直到下一次運行循環開始時纔會出現實際顯示。在OS X中,您可以使用-display來立即繪製視圖,但我不認爲Apple創建了一個在iOS上執行此操作的公共方法。但是,如果下一個方法只是簡單地創建後臺線程,那麼它會很快返回,並且在線程完成之前顯示更新可能會發生。

相關問題