2011-10-09 4 views
0

로그 디스플레이로 사용하는 읽기 전용 텍스트 필드가 있습니다. 나는 애플 리케이션의 문서 디렉토리에있는 모든 파일을 제거하는 작업을했습니다. 각 파일을 제거 할 때 로그 라인을 삽입하고 싶습니다. 그러나 텍스트 필드는 전체 작업이 끝나면 업데이트됩니다. 이 문제를 어떻게 해결할 수 있습니까?루프에서 실행 중일 때 ui 업데이트

NSFileManager *fm = [[[NSFileManager alloc] init] autorelease]; 
NSError *error = nil; 
for (NSString *fileName in array) { 
    NSString *filePath = [DOCUMENT_PATH_VALUE stringByAppendingFormat:@"/%@", fileName]; 
    [fm removeItemAtPath:filePath error:&error]; 

    if (!error) { 
     NSString *log = [NSString stringWithFormat:@"removed success: %@", fileName]; 
     [self logThis:log]; 
    }else{ 
     NSString *log = [NSString stringWithFormat:@"remove failed: %@, %@", fileName, [error localizedDescription] ]; 
     [self logThis:log]; 

-(void)logThis:(NSString*) text{ 
    NSRange range = NSMakeRange([updateLogTextView.text length], [text length]); 
    updateLogTextView.text = [updateLogTextView.text stringByAppendingFormat:@"%@\n", text]; 

    [updateLogTextView scrollRangeToVisible:range]; 
} 

답변

0

장기 실행 작업을 백그라운드 스레드/대기열로 옮기고 UI 업데이트 코드가 항상 주 스레드에서 실행되는지 확인해야합니다.

예 :

- (void)processFiles:(NSArray *)array 
{ 
    //You need to create your own autorelease pool in background threads: 
    NSAutoreleasePool *pool = [NSAutoreleasePool new]; 
    //... 
    NSString *log = ...; 
    [self performSelectorOnMainThread:@selector(logThis:) withObject:log waitUntilDone:NO]; 
    //... 
    [pool release]; 
} 

그런 다음 사용하여 작업을 시작합니다 :

[self performSelectorInBackground:@selector(processFiles:) withObject:files]; 

또 다른 옵션이 될 것이다 블록 그랜드 센트럴 디스패치를 ​​사용.

자세한 내용은 Threading Programming GuideConcurrency Programming Guide을 참조하십시오.

0

당신은 비동기 호출 Threading 및 제작을 조사해야합니다

여기 내 코드입니다. 현재 주 스레드를 차단하고 있습니다 (거기에서 호출되었다고 가정). 메인 스레드가 UI의 새 텍스트로 업데이트되는 동안 별도의 스레드가 많은 작업을 수행하도록 두 스레드를 분리해야합니다.

0

방금 ​​iOS dev을 시작했는데 UIText를 다시 그려야 할 것 같은데요. 로그를 작성하면 원래 UIText 객체 인 realloc을 dealloc 할 수 있다고 가정합니다. 새 로그 메시지로 다시 그립니다. 문제는 그것이 매우 빨리 업데이트되어 ios에 휴면 기능이없는 한 그럴 가치가 없다는 것입니다.

같은

뭔가 : 루프에서 다음 ALLOC 및 초기화 텍스트 각각 작성하거나 텍스트 및 realloc을 할당 해제의 로그에 새 메시지와

이쪽 UIText 개체를 다시 그리기 및 텍스트를 업데이트해야합니다 텍스트 초기화하기 후에, 경우 그것은 메모리 쓰기 오류/응용 프로그램 충돌을 기대하지 않습니다

관련 문제