2012-08-09 1 views
1

나는 온 - 플라이 (on-the-fly) 방식으로 생성 된 모든 CGImage에 내용이 설정되어있는 애니메이션 된 UIView 인스턴스를 전체적으로 가지고있다. 잘 작동하지만 이미지 생성 속도가 느립니다 (1/4 초에서 1 초 정도, 즉 용납 할 수 없음).새 UIView 레이어 내용을 백그라운드 스레드에 렌더링 하시겠습니까?

그래서 저해상도 근사값을 매우 빨리 생성 (예 : 1/100 초)하고 UIView의 CALayer의 내용 (예 : view.layer.contents)을 저해상도 이미지로 설정하고 즉시 배경 스레드를 생성하여 고해상도 버전을 생성하여 준비가 완료되는 즉시 저해상도 버전을 대체 할 수 있습니다.

이 작업을 수행하는 데있어 합리적인 방법은 무엇입니까?

내 생각에 GCD (그랜드 센트럴 디스패치)를 사용하여 백그라운드 스레드를 예약 한 다음 완료시 메시지를 다시 보내야한다고 생각했습니다. 이렇게하면 완료 메시지의 일부로 새로운 고해상도 대체 이미지를 보내는 것이 합리적일까요?

백그라운드 스레드를 취소해야하는 경우 어떻게해야합니까? 이것은 사용자가 다른 오브젝트로 페이지를 이동하는 경우 발생합니다.이 경우 현재 백그라운드 태스크를 취소하고 다른 뷰에 대해 새 태스크를 시작해야합니다. (실제로는 꽤 일반적으로 발생하므로 실제로 처리해야합니다.) CGPath, CGGradient, CGImage 등의 객체를 처리하는 중간에있을 수 있기 때문에 백그라운드 작업을 죽일 수는 없다고 생각합니다. 그걸 풀어 줘야 해. 다른 스레드가 테스트 할 수있는 스레드에서 플래그를 설정하는 몇 가지 방법은 무엇입니까? 주 스레드에서 백그라운드 스레드로 어떤 종류의 "중단"신호를 보내야합니까? 그런 다음 백그라운드 스레드가 가장 편안한 지점에서 이미지 자체의 생성을 중단하게할까요?

+2

Watch Session 211 - [WWDC 2012] (https://developer.apple.com/videos/wwdc/2012/)에서 iOS의 동시 사용자 인터페이스를 작성합니다. 귀하의 질문에 직접적으로 부합하는 많은 정보가 있습니다. 세션 235와 238을 체크 아웃 할 수도 있습니다. –

+0

쿨, 방금 211 번 시청을 끝냈습니다. NSOperationQueue는 길을가는 것처럼 보입니다. 감사. –

+1

Rob mayoff 덕분에, Session 211을 본 후, 나는 UITableView 성능 문제를 해결했습니다! – vampirewalk

답변

1

나는 이것을 위해 GCD를 쓰지 않을 것이다. GCD는 콜백에서 UI를 업데이트하는 데 문제가 있습니다. 이미지 당이 작업을 수행하면 성능이 저하됩니다. 단일 스레드를 분리하고 이미지 중 하나가 렌더링 될 때마다 콜백을 순차적으로 실행하는 고해상도 이미지를 실현하십시오. 훨씬 더 간단하고 주 스레드에 대한 콜백은 훨씬 빠르게 표시됩니다.

GCD의 UI 업데이트가 너무 느린 것처럼 매우 안정적으로 보입니다. 이것이 왜 있는지.

+0

글쎄, 보조 스레드가 UI를 업데이트 할 것이라고 생각하지 않았지만 보조 스레드가 완성 된 이미지를 포함하는 메시지를 주 스레드에 보내면 주 스레드는 UI를 업데이트합니다. –

+1

네, 그래야합니다.하지만 GCD는 이런 이유로 GCD 코드를 제거해야만한다는 점에서 너무 효율적이지 않습니다. [self performSelectorOnMainThread : @selector (update :) withObject : value waitUntilDone : NO]; 배경 스레드에서 잘 작동합니다. –

관련 문제