2012-05-02 3 views
0

UILabel을 "while 루프"내에서 업데이트하려고하지만 UILabel 텍스트가 변경되지 않았습니다. 나는 그것이 iOS에 대한 평소와 같이 주 스레드에서 현재 실행 루프 사이클의 끝에 표시된다는 것을 알고 있습니다. 그러나이 문제를 어떻게 해결할 수 있습니까? ftp.AsyncFinished 함수는 외부 chilkat ftp 모듈에서 제공됩니다.UILabel을 "while 루프"로 업데이트하십시오.

데이터는 매 초마다 업데이트됩니다. 이 포럼과 Apple 설명서를 검색했지만 메인 스레드의 "while 루프"내에 UILabel을 업데이트하는 올바른 방법을 알 수 없었습니다. while 루프 대신에 무엇을 사용하면 주 스레드가 UILabel을 업데이트 할 수 있습니다.

while (ftp.AsyncFinished != YES) { 
    // here is the code getting data from the cilkat FTP module stored in PercentOfFile and MinutesRemaining 
    NSString *content =[[NSString alloc] initWithFormat:@"%.0f%% done%.0fmin left",PercentOfFile,MinutesRemaining ]; 
    [LabelProgress setText:content]; 
} 
+4

http://stackoverflow.com/questions/6363828/updating-uilabel-in-the-middle-of-a-for-loop – Habib

+0

@ Habbib.OSU'runMode : beforeDate :'접근법은 매우 위험합니다. GCD에 기반한이 질문에 대한 더 나은 솔루션을 추가했습니다. –

답변

1

다른 스레드에서 업로드 진행 상황을 호출하고 콜백을 등록해야합니다. 콜백을 등록, 당신은 "FTP"와 "UploadProgress"라는 이름의 사용자 정의 클래스라는 CkoFTp2 개체가 가정

- (void)PercentDone: (NSNumber *)pctDone abort:(BOOL *)abort; 

:이 방법이있는 CkoFTP2Progress에서 상속 사용자 정의 클래스를 작성

[self.ftp setEventCallbackObject:self.uploadProgress]; 
0

당신은 백그라운드 스레드로 while 루프를 이동하고 performSelectorOnMainThread와 거기에서의 setText를 호출 할 수 있습니다.

+1

... 또는 단순히 레이블을 업데이트하는 주 스레드에서 타이머를 실행하십시오. – Till

+0

외부 FTP 모듈에 연결하여 while 루프를 백그라운드 처리로 이동할 수 없습니다. 타이머로 어떻게 할 수 있습니까? – Jan

4

UI가 전혀 업데이트되지 않게하려면 주 스레드의 실행 루프를 완료해야합니다. 즉, UI 업데이트가 발생하기 전에 메서드 (메인 스레드에서 호출 된 경우)가 반환되어야합니다. 그런 다음 모든 업데이트가 병합되고 UI가 다시 그려집니다.

자세한 내용은 What is the most robust way to force a UIView to redraw?을 참조하십시오.

while 루프가 비동기 업데이트 용으로 잘못 설계되었습니다. 루프 while 중간에 비동기 데이터를 가져 오면 안됩니다. 어떤 종류의 콜백을 등록해야하며 (일반적으로 자신을 delegate으로 설정하여) 시스템에서 전화를 기다리는 중입니다.

0
// update your UILabel here 
// ... 

// Delay execution of long-running task so that update of UILabel can be performed 
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ 
    // long-running task 
    // .. 
}); 
관련 문제