2011-01-21 6 views
7

목표는 "tableview를 표시하기 전에 데이터를로드하는 viewWillAppear의 시작 부분에서 스피너 그래픽을 시작합니다"이므로 테이블을보기 전에 왜 지연이 발생하는지 궁금하지 않습니다. 나는. UIActivityIndicatorView가 윈도우에 추가되었고, 그냥 숨기거나 보여주기 위해 알파를 설정하려고합니다.크래시 - "Collection <CALayerArray : 0x645dfc0>이 (가) 열거되는 동안 변형되었습니다."

"회전 기어"imageview (tag = 333)가 표시되도록 스레드를 시작할 때이 이상한 오류가 발생하여 viewWillAppear의로드/계산으로 이동하기 전에 이동하십시오.

나는 [appdel addGearz]와 [appdel removeGearz]를 호출 할 때마다 그것을 얻지는 않지만,이 두 가지 모두에 대해 발생하며 무작위입니다. 2 개의 viewWillAppears 이후 또는 15 이후에 발생할 수 있습니다. 알파를 설정하는 행을 주석 처리하면 모든 것이 작동합니다. 전형적인 viewWillAppear 이런 식으로 뭔가를 보이는

, 여기

[super viewWillappear]; 
[email protected]"Products listing"; //and other simple things 
[appdel addGearz]; 
[self getProducts]; 
[self getThumbnails]; 
[myTableView reloadData]; //in case view already loaded and coming back from subview and data changed 

그리고는 (α)와 선이

-(void)addGearz { 
    [NSThread detachNewThreadSelector:@selector(gearzOn) toTarget:self withObject:nil]; 
} 

-(void)removeGearz { 
    [NSThread detachNewThreadSelector:@selector(gearzOff) toTarget:self withObject:nil]; 
} 

- (void)gearzOn { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    [window viewWithTag:333].alpha=1.0; 
     // 
     // [[window viewWithTag:333] setNeedsDisplay]; 
    [pool drain]; 
} 

- (void) gearzOff { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    [window viewWithTag:333].alpha=0.0; 
     // 
     // [[window viewWithTag:333] setNeedsDisplay]; 
    [pool drain]; 
} 

을 주석 처리되지 않습니다 내가 다른 사람의 코드를 사용한 경우 충돌 코드입니다 , 그래서 ... 당신이 볼 수있는 명백한 무엇인가? 확실하게 스레드에서 UIView의 알파를 변경할 수 있어야합니까? 일부는 "내가 이것을 변경하는 동안 열거 중지"코드에 알파 변경을 "포함"해야합니까?

알파 변경 라인을 풀 alloc 이상 또는 [pool drain] 아래로 옮겨서 충돌을 일으키지 않았지만, "풀 리졸버없이 자동으로 리 레이됩니다."- 메시지 만 남김 .

분명히,이 스레드 코드에 대해 이해할 수없는 것이 있습니다.

답변

8

별도의 스레드에서 UI를 수정하지 마십시오. UI는 주 스레드에서만 조작해야합니다.

새 스레드를 분리하는 대신 performSelectorOnMainThread:withObject:waitUntilDone:을 사용해야합니다. 이렇게하면 메서드가 적절한 스레드에서 호출됩니다.

+0

[self performSelectorOnMainThread : @selector (gearzOn) withObject : nil waitUntilDone : YES]; 뷰를 푸시하기 전에 viewWillAppear가 모든로드를 수행하므로 사용자는 어떤 일이 발생하고 있음을 인식해야합니다. –

+0

[window setNeedsDisplay]와 함께 표시되지 않았습니다. 어느 한 쪽. 하지만 알파 UIAnimation을 사용하면 효과적입니다. (빠른 페이드.) 그게 왜 작동하지만 알파를 설정하고 창문을 업데이 트 묻는 모든 아이디어? 당신의 대답을 정확하다고 표시 할 것이고, 그것은 문제를 해결할 것입니다. 감사! –

+0

레이어의 표시 대기열과 애니메이션이 처리되는 방식과 관계가 있다고 생각합니다. UIAnimation이 트릭을 수행했음을 아는 것이 좋습니다. –