NSOperation
과 드로잉의 사용에 대한 조언을 듣고 있습니다.NSOperation은 UI 페인팅을 차단합니까?
메인 스레드에서 내 NSOperation
서브 클래스를 만든 다음 NSOperationQueue
에 추가합니다.
NSOperation
내
NSOperation
은 몇 가지 무거운 처리를 수행합니다. main() 메서드를 몇 분 동안 반복 처리하여 끊임없이 일부 작업을 처리하기위한 것이지만 지금은 sleep (1) 루프가있는 while() 루프가 있습니다. 이것은 테스트를 위해 약 5 번만 돌아가도록 설정됩니다.
이 NSOperation
를 생성하는 메인 (원래) 스레드는 뷰를 그리거나 UI를 업데이트합니다.
NSOperation 스레드가 알림을 사용하여 주 스레드에게 처리량을 줄 였음을 알리려고했습니다.이 알림은 while() 루프를 통과 할 때마다 한 번 전송됩니다. 잠을자는 동안 1 초에 1 번). 주 스레드 (보기)는 이러한 알림을 수신하도록 등록합니다.
통지는 즉시 주 스레드로 전달되며 비동기식으로 보입니다. 두 스레드가 동시에 예상대로 실행되는 것으로 보입니다. (NSLog()를 사용하여 각 스레드가 알림을 보내고받을 때 대략 확인합니다.)
뷰가 알림을 받고 해당 핸들러 메서드가 호출되면 간단히 정수 변수를 증가시키고이를 뷰에 표시합니다 (물론 문자열로). 테스트에서 drawRect :의 코드는이 정수 (문자열)를 화면에 잘 그립니다.
그러나 여기 : 내 문제가 (미안 그것은 여기에 도착하는 동안 조금 걸렸습니다) : 주 스레드 (보기) NSOperation에서 알림을 받으면이 테스트 정수를 업데이트하고 [self setNeedsDisplay] 호출합니다. 그러나 뷰 NSOperation 완료 될 때까지 자체 다시 그리지 않습니다! 별도의 스레드 인 NSOperation에는 주 스레드의 이벤트 루프를 차단할 수있는 기능이 없을 것으로 예상되었지만 이것이 발생하고있는 것으로 보입니다. NSOperation이 끝나고 main()이 반환되면 뷰는 마침내 직접 다시 그립니다.
아마 NSOperation
를 올바르게 사용하지 않을 것입니다. "비 동시성"모드에서 사용하고 있지만, 이름에도 불구하고 이것이 여전히 새로운 스레드를 생성하고 비동기 처리가 가능하다는 것을 이해합니다.
어떤 도움이 필요하시면 언제든지 알려주십시오.
원한다면 그 알림을 전부 쓰지 않고도 NSOperation 메인 메소드에서 곧바로 performSelectorOnMainThread : withObject : waitUntilDone :) 할 수 있습니다. – grzaks