2012-08-28 10 views
4

UI가 메인 스레드에서만 업데이트되어야한다는 것을 알고 있지만 보이는 뷰에 추가되지 않는 한 별도의 스레드에서 서브 뷰를 생성하고 추가 할 수 있습니다 ? 메모리 및 성능 문제가 발생합니까? 다음은 몇 가지 예제 코드입니다.백그라운드 스레드에서 UIView 빌드하기

NSOperationQueue *queue = [[NSOperationQueue alloc] init]; 
[queue addOperationWithBlock:^{ 
    // do some fancy calculations, building views 
    UIView *aView = .. 
    for (int i, i<1000, i++) 
    { 
     UIView *subView = … 
     [aView addSubview:subView]; 
    } 

    // Update UI on Main Thread 
    [queue addOperationWithBlock:^{ 
     [[NSOperationQueue mainQueue] addOperationWithBlock:^{ 

      // Update the interface 
      [self.view addSubview:aView]; 
     }]; 
    }]; 
}]; 
+2

2012 WWDC 비디오 "iOS의 동시 사용자 인터페이스 만들기"를 확인하십시오. –

답변

3

이 작업을 수행하지 않으려는 이유 나의 이해는 CALayer는 스레드로부터 안전하지 않습니다 메모리 byy 백업된다는 점이다. 따라서 배경 스레드를 그릴 수는 있지만 레이어를 렌더링하거나 뷰를 조작 할 수는 없습니다.

그럼 어떻게하면 복잡한 뷰 로직을 이미지 컨텍스트에 그려 넣고 이미지를 메인 스레드에 전달하여 이미지 뷰에 표시 할 수 있습니다.

희망이 도움이됩니다.

+0

그래서 내가 볼 수있는 뷰에 추가하지 않고도 UIViews를 만들 수도 있고,이 뷰에 하위 뷰를 추가 할 수도 있습니다. (아마도 생성 후 배열에 추가하는 것입니다.) 그리고 나서 배열을 단계별로 살펴보고 보이는 뷰에 추가할까요? 고마워. – cannyboy

+1

나는 그것이 명백하게 금지되는지 모른다. 하지만 내 질문에 왜 그런 것 같아? 드로잉이 병목 현상 인 경우 배경 계층에 뷰 계층 구조를 구축 할 수 있다고하더라도 가시적 계층 구조에 추가하면 메인 스레드에서 그려집니다. 그리고 뷰를 생성하기위한 계산이 병목 현상이라면 백그라운드에서 계산을 수행하고 결과를 메인 스레드에 전달하고 뷰 계층을 빌드하십시오. –

2

보조 스레드에서 UI가 변경되면 앱이 다운됩니다. 따라서 항상 메인 스레드에서 UI를 변경하십시오.

[self performSelectorOnMainThread:@selector(makeUIChanges:) withObject:nil waitUntilDone:YES]; 
관련 문제