2011-03-19 3 views
0

저는 웹 서비스 데이터 처리 응용 프로그램을 만들고 있으며 가능한 한 빨리 응용 프로그램을 실행하려고합니다. 특정 3 손가락 제스처가 수행 될 때, 업데이트 된 정보를 서버로 보내어 새로운 이미지 배치를 가져 와서 기존의 업데이트를 업데이트하는 메소드를 호출합니다.GUI 작업이 실제로 수행되는 방법은 언제입니까?

그래서 배열에 15 개의 이미지가 있다고 말하면 2 개의 손가락 제스처로 필터링 할 수 있습니다. 그런 다음 3 개의 손가락 제스처를 할 수 있고 동일한 설정을 얻을 수 있습니다. 뒤로, 그냥 약간 조정했다 (대비/밝기 등).

내가 원했던 것은 첫 번째 이미지가 검색된 후 이미지를 표시하는 imageView를 업데이트 할 수 있기 때문에 시리즈의 나머지 부분이 어떻게 보이는지에 대한 느낌을 사용자에게 제공 할 수 있습니다. . 그러나 무엇을 시도해도, 그리고 내가 시도하고 구현하는 스레드가 얼마나 많은지간에 전체 다운로드가 완료되기 전에 imageView를 업데이트 할 수 없습니다. 일괄 다운로드가 완료되면 (별도의 스레드에서 처리됨) imageView가 새로운 이미지로 업데이트되고 모든 것이 훌륭합니다.

-(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]; 
} 



    } 

따라서 (더 스레드 거기에서 실행되고 있지 두 가지 방법으로 이것을 분리함으로써 :

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 방법이다

과정의 첫 번째 단계는 이쪽 이 시점에서 이러한 메서드는 모두 호출되기 전에) preDownload 메서드가 완료된 후 imageView가 업데이트되고 컨트롤이 downloadAllImagesWithWL 메서드에 계속 적용될 것이라고 생각했지만 그럴 수는 없습니다. .

나는 여기에 간단한 것을 놓치고 있습니까? 두 번째 방법을 실행하기 전에 GUI 요소를 업데이트하려면 어떻게해야합니까?

답변

0

당신 말이 맞습니다. 그러나 코드가 runloop에 도달 할 때까지 viewn이 새로 고쳐지지 않습니다. 당신은 2 일 수행 할 수 있습니다

  • 것은 당신의 downloadAllImagesWithWL 방법 비동기 확인을, 그래서 당신이 그것을 호출 후 반환됩니다, 주 스레드 runloop, GUI 업데이트에 도달 할 때, 그리고 그 완료 다운로드 방법은 콜백을 통해 논리를 말할 것이다 .

또는

  • 더 간단하게 hackier (나쁜) 솔루션

    당신이 당신의 다운로드 방법을 호출하기 전에 몇 시간 동안 runloop 실행하는 것입니다. 다음과 같은 : [[NSRunloop currentRunLoop] runUnitlDate : [Date dateWithTimeIntervalSinceNow : 0.1]]; 0.1 초 동안 runloop을 실행합니다.
0

이미지가 설정되면 이미지보기가 자체 디스플레이로 표시됩니다. 실제 표시는 다음 실행 루프가 시작될 때까지 발생하지 않습니다. OS X에서는 -display을 사용하여 즉시 뷰를 그릴 수 있지만 Apple이 iOS에서이 작업을 수행하는 공개 방법을 만든다고 생각하지 않습니다. 그러나 다음 메소드가 단순히 백그라운드 스레드를 작성하면 스레드는 신속하게 리턴되며 스레드가 완료되기 전에 디스플레이 갱신이 일어날 것입니다.

관련 문제