2013-08-14 3 views
0

다른 누구에게이 문제가 있습니까? 상황에 따라 시간이 필요하고 때로는 매우 빠르게 실행되는 기능이 있습니다. 이 함수는 새 뷰 컨트롤러가 표시 될 때 호출되어 함수가 실행 중임을 사용자에게 알립니다. dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{을 사용하여 새 스레드에서 함수를 실행하는 동시에 새 뷰 컨트롤러 및 작업 표시기 .활동 표시기 기능이 상당히 느려짐

예상대로 작동하지만 특정 순간에 거의 즉시 실행해야하는 특정 경우에는 거의 3 초가 걸립니다. 활동 표시기가 사라지고 내용이 표시되기 전에 그것은 항상 같은 시간 (3 초) 걸릴 상황을 신경 쓰지 않는 것 같다 그러나 내가 메인 스레드에서 그것을 실행하면 제한된 시간이 오래 걸립니다.

+4

당신은 백그라운드 스레드에서 (예 : UIActivityIndicatorView''같은) 어떤 UIKit 클래스를 사용해서는 안/열. UIKit은 대부분 주 스레드 전용입니다. – omz

+0

더 빨리 가고 싶다면'DISPATCH_QUEUE_PRIORITY_LOW'를 사용하지 마십시오. 대신에'DISPATCH_QUEUE_PRIORITY_DEFAULT' 또는'HIGH'를 사용해주세요. 전역 대기열의 주 스레드 성능에 영향을 미치지 않아야합니다 (높음도 포함). 그게 그들이 거기에있는 이유입니다. – amattn

+0

@amattn 예, DEFAULT 또는 HIGH를 시도했지만 작동하지 않았습니다. – flouwer

답변

4

omz가 지적했듯이 대부분의 UIKit 클래스는 스레드로부터 안전하지 않으며 UI 관련 항목은 주 스레드에서 발생해야합니다. 작업 표시기는 다음과 같습니다 게재하는 올바른 방법이 다른 큐에 대한 몇 가지 임의-장기 실행 일을합니다 :

[self showProgressUIOrWhatever]; 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    [self doSomeWork]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self hideProgressUIOrWhatever]; 
    }); 
}); 
+0

Wiherspoon 답변 해 주셔서 감사합니다. thirdTabClicked 함수 안에서'[activityView stopAnimating]'을 실제로 말하고 있습니다. "ActivityView stopAnimating"을 넣었을 때 Activity Indicator가 너무 일찍 사라진 것처럼 보였습니다. 콘텐츠 요소가 표시 될 때까지 약 2 초가 걸립니다. – flouwer

+1

"표시 할 콘텐츠 요소"를 예로 들면, 예를 들어 테이블보기를 다시로드하면 , 메인 큐 블록 안에 있어야합니다. 그것은 단지 활동 지표가 아닙니다. –

+0

그래, 나는 CollectionView를 다시 불러 와서 Labels와 UIImageViews를 만들었으므로 이것이 배경 스레드에서 느린 이유 인 것 같다. – flouwer