2010-06-18 4 views
4

CATiledlayer을 사용할 때 drawLayer:drawlayer:inContext:이 여러 스레드에서 호출된다는 것을 알고 있지만, drawRect:은 무엇입니까?drawRect : CATiledlayer를 사용할 때 여러 스레드에서 호출 되었습니까?

Apple의 PhotoScroller 예제 코드는 drawRect:을 사용하여 이미지를 디스크에서 가져오고 스레드 처리를위한 특별한 코드는 없습니다.

CATiledLayer의 모델이 스레드로부터 안전해야하는지 여부를 확인하려고합니다.

답변

1

본 적이 있습니까? technical Q&A from Apple?

직접 질문에 답변하지 않지만 모델을 구현하는 방법을 결정하는 데 도움이 될 수 있습니다.

+0

이 기사에는 모순이 있지만 꽤 많이 스레드해야한다고 나와 있습니다. WWDC 세션 비디오를보고 나에게이 사실을 확신시켜주는 퍼즐 조각을 하나 더줍니다. –

2

예. drawRect는 여러 스레드에서 호출 될 수 있고 호출 될 것입니다 (OS 4.2에서 테스트 됨).

그림이 새로운 확대/축소 제스처를 앞지르는 속도보다 빠르면 확대/축소 동작을 빠르게 입력 할 때까지 응용 프로그램이 제대로 작동 할 수 있으므로이 동작은 덜 명확합니다.

한 가지 대안은 모델을 스레드로부터 안전하게 만드는 것입니다.

데이터 모델에 대한 대부분의 액세스를 한 번에 하나의 드로잉 스레드와 동기화하여 스레드 안전성을 얻으면 drawRect의 본문을 @syncrhonize (self)와 같은 뮤텍스로 처리 할 수 ​​있습니다. 작동하는 것 같습니다.

CATiledLayer가 백그라운드 스레드를 하나만 사용하도록 요청하는 방법을 찾지 못했습니다.

+0

모델을 뷰 객체 (계층)에 직접 할당하지 않는 것도 고려할 수 있습니다. 그러나 컨트롤러가 모델 변경을 처리하도록하고 변경 불가능한 스레드 안전 객체를 레이어에만 할당합니다. 모델이 변경되면 항상 레이어를 업데이트하고 setNeedsDisplay를 호출 할 수 있습니다. – Alej

2

나는 CATiledLayer이 iOS 시뮬레이터에서 다중 배경 스레드를 사용하지만 내 iPhone에서 하나의 배경 스레드를 사용하고 있음을 발견했습니다.

내 Mac에는 듀얼 코어 프로세서가 있지만 iPhone에는 단일 코어 (A4)가 있습니다.

A5 CPU가 장착 된 iOS 장치에서도 여러 스레드가 사용되는 것 같습니다.

관련 문제