2012-05-07 4 views
5

메인 스레드와 속도 저하에 addsubview 내가 그래서NSOperation : 나는 다음과 같은 NSOperation 구현 한

- (void)drawRect { 

    <<Drawing code>> 

    NSLog(@"Drawed"); 
    delegate.drawedViews++; 

    if (delegate.drawedViews==VIEWS_NUMBER) { 
     [delegate allViewsDrawn]; 
    } 
} 

대리인이 N 사용자 정의 조회 수있는 CustomView의의 drawRect 방법에

- (void)main { 

    for (int i=0; i<N; i++) { 

     << Alloc and configure customView #i >> 
     //(customView is a UIView with some drawing code in drawrect) 

     [delegate.view addSubview:customView]; 

    } 

    NSLog(@"Operation completed"); 
} 

을 그립니다 모든 뷰가 그려지는 경우 알림을받습니다.

문제는 "작업 완료"로그 후 첫 번째 "그리기"로그가 표시되기까지 약 5 초가 걸리는 것입니다.

왜 이런 일이 발생합니까? 그리고 일반적으로 말하자면, 어떤 코드가 실행되는 데 많은 시간이 걸리는지 알아 내기 위해 어떻게 행동해야합니까?

------ 수정 ------ 때때로

(같은 1 시간 초과 10) 나는 NSOperation에서 addsubview를 호출하지 않아야 때문에 이후, 이렇게 충돌을 얻고 있었다 스레드로부터 안전하지 않습니다. 그래서

으로 변경했습니다.
[delegate.view performSelectorOnMainThread:@selector(addSubview:) withObject:customView waitUntilDone:NO]; 

이제 더 이상 충돌이 발생하지 않지만 프로세스를 실행하는 데 시간이 오래 걸립니다! 이전보다 5 배나 좋아요.

왜 그렇게 느린가요?

답변

5

하는 일이 우리가 NSOperation 잊고이 "속임수"를 사용할 필요가 제대로 작동

dispatch_queue_t main_queue = dispatch_get_main_queue(); 
dispatch_async(main_queue, ^{ 

    [self createCustomViews]; 

    dispatch_async(main_queue, ^{ 

     [self addAnotherCustomViewToView]; 

    }); 
}); 
+0

안녕을 만들려면! 질문 : 왜 중첩 된 dispatch_async가 필요한가요? (나는 당신이 그 이유 때문에 그것을 그렇게 썼다 고 믿는다. 나는 아직 그것을 보지 않고있다.) 고마워! –

+0

솔직히이 코드를 발견하고 작동합니다. 나는 이것보다 더 많이 알지 못한다 :-) – Abramodj

+0

OK! (이제 저는 선교 사역을하고 있습니다.) 게시 해 주셔서 감사합니다. :) –