2012-06-20 1 views
16

UIView는 스레드로부터 안전하지 않으므로 배경 스레드에서 뷰를 추가 할 필요가 없습니다.이 문제를 해결하려면 UIView를 백그라운드 스레드에 생성 한 다음 주 스레드에 추가하십시오.배경 스레드에서 UIView를 만드는 것이 좋습니까?

참고 : 실제 스레드가 훨씬 복잡하고 모든 뷰를 작성하고 값을 채우는 데 시간이 좀 걸리기 때문에 주 스레드에서이 작업을 수행하지 않는 이유가 있습니다. 내가 이것을 할 때 UI가 응답하지 않게되기를 원하지 않습니다. 그래서 이것을 해결하려고합니다. 예

.. 미리

-(void)addLabel//called on background thread 
{ 
    UILabel * label = [[UILabel alloc]initWithFrame:CGRectMake(0,0,40,100)]; 
    [label setText:@"example"] 
    [self.view performSelector:@selector(addSubview:) onThread:[NSThread mainThread] withObject:example waitUntilDone:YES]; 
} 

감사합니다.

+0

나는 그것이 맞다고 믿는다. 백그라운드에서 만들지 만 UI에서 UI를 업데이트하십시오. –

답변

15

:

스레딩 고려 사항 주 스레드에서 발생해야합니다 응용 프로그램의 사용자 인터페이스에 대한

노는

. 따라서 항상 응용 프로그램의 주 스레드에서 실행되는 코드에서 UIView 클래스의 메서드를 호출해야합니다. 이것이 엄격하게 필요하지 않을 수있는 유일한 시간은 뷰 객체 자체를 생성 할 때이지만 다른 모든 조작은 주 스레드에서 발생해야합니다.

initWithFrame:에 대한 호출은 스레드로부터 안전하지 않습니다. setText:에 대한 호출은 "조작"조항에 해당하는 스레드로부터 안전하지 않을 가능성이 큽니다. 이것들은 thread 세이프 인 것은 확실히 보증되지 않습니다.

백그라운드 스레드의 데이터를 찾아 내야합니다. 그런 다음 주 스레드에서보기를 만듭니다. 많은 수의보기가있는 경우 여러 개의 dispatch_async() 호출을 사용하여 기본 대기열로 작업을 분할 할 수 있습니다. 이로 인해 UI가 응답 할 수 있습니다. 나는 그것을 광범위하게 실험하지 않았다.

가능한 경우 UIView에서 CALayer으로 전환하는 것이 좋습니다. 배경 스레드에서 대부분 CALayer 작업을 수행 할 수 있습니다. 어쨌든 조회수가 많으면 비효율적입니다. 뷰의 데이터를 계산하는 데 오랜 시간이 걸리는 경우 모델 및 뷰 정보를 올바르게 구분하지 못했음을 나타냅니다. Model 클래스는 Views 생성과는 별도로 필요한 모든 것을 계산해야합니다.

+5

죄송 합니다만 답변을 명확히 할 수 있습니까? ? 사과의 견적은 백그라운드에서보기를 만드는 것이 괜찮다고 말하지만, 그렇지 않다는 것을 말하고있는 것입니다. 왜? –

+0

@iamataptool 아마'init' 메소드로 UIView를 안전하게 만들 수 있지만'initWithFrame :'메소드로 생성 할 수는 없을 것입니다. – DanSkeel

+0

CALayer 팁으로 하루 종일 근무했습니다. 고마워요! –

0

Drawing and Printing Guide 상태 :

중요 UIKit 클래스는 일반적으로 스레드 안전하지 않습니다. 모든 그리기 관련 작업은 응용 프로그램의 주 스레드에서 수행해야합니다.

따라서 내가 알기로는 유일한 문제는 "그리기 관련 작업"과 관련이있는 것으로 보입니다. 올바른 클래스가 drawRect: 메소드에서만 이러한 작업을 실행한다고 가정하면 제안한 접근 방식이 좋을 것입니다. UIView에서

+0

필자의 경우, 내 응용 프로그램은'UIApplicationLaunchOptionsLocalNotificationKey'를 통해 깨어 났으므로 백그라운드에 있습니다. 괜찮습니까? 앱을 백그라운드로 실행할 때 하위 뷰 추가를 수행하면 어떻게됩니까? https://stackoverflow.com/questions/46584566/how-to-stop-handle-ui-operations-in-ios-when-app-moves-to-background-state – Nil

3

Xcode 버전 9.0 베타 3 (9M174d)을 사용하여 경고 메시지가 나타납니다.

[UView 초기화]은

그래서 내가 생각

당신이 메인 스레드에서 UI를 만들어야합니다 메인 스레드에서 호출해야 더 나은

는보기 아래 그림 :

enter image description here

관련 문제