2009-12-17 5 views
0

내 코코아 터치 앱에 UIProgressBar보기가 포함 된 상태보기를 보여주는 MainViewController가 있습니다.모델 클래스의 UIProgressBar와 상호 작용

MainViewController에서 FlickrImage 모델 개체가 만들어지고 반복됩니다. FlickrImage 개체 자체가 Flickr API와 상호 작용하기 때문에 사용자가 진행률 표시 줄을 보길 원하는 시간이 걸립니다. 이제는 (적어도 저에게 그렇습니다;) 도전 과제는 FlickrImage 개체의 UIProgressBar (메시지 progress)와 상호 작용하는 것입니다. NSNotificationCenter을 사용하여이 작업을 수행합니까? 아니면 그냥 MainViewController를 FlickrImage의 전달 클래스로 선언하고 UIProgressBar와 직접 상호 작용할 수 있습니까?

답변

2

가장 좋은 방법은 이다 (당신이 MVC 위반하고) 모델에서 UI를 처리 할 FlickrImage에서 UIProgressBar를 업데이트하지 모델 호출 전혀 아무것도하지만, use KVO에이 모델을 관찰 한 다음 모델이 업데이트 될 때받는 메시지에 반응하십시오. 별도의 모델 레이어가있는 점은 모델이 사용자에게 데이터가 표시되는 방식에 대해 알 필요가 없기 때문입니다.. 데이터 관리자 클래스는 선언이 있는지 확인

[imageManager addObserver:self forKeyPath:@"progress" options:nil context:nil]; 

:

그래서 같은 것을 (이미 이러한 클래스가 가장 가능성이) 모든 이미지의로드를 추적하는 클래스를 생성 할 (이상적으로 0.0에서 1.0까지의 값을 가짐) 속성을 사용하고 관리자에서 값을 업데이트 할 때 점 표기법을 사용해야합니다. self.progress = newVal;

이것은 모델 클래스에서 알림을 보내는 것보다 훨씬 깔끔합니다. 다른 방법으로는 관리자에게보기를 대리인으로 등록하는 것입니다. 대리인 프로토콜을 사용할 때 오버 헤드가 약간 적지 만 대리인을 사용해야하는 경우와 KVO가 더 좋은 경우에 대한 명확한 기준은 없습니다. 애플은 두 가지 접근법을 모두 사용하지만, KVO에 더 의존하는 경향이 있습니다. 제 의견으로는 좋은 점입니다.

+0

이것은 의미가 있습니다 - 나는 MainViewController에서 이미지 로딩을하고 있음을 인정해야합니다. 저는 이사하고 리팩토링하고 있습니다. 이것은 다른 어떤 것보다 많은 학습 교습을위한 것입니다. 결과에 대해 시도하고보고 할 것입니다. 설명해 주셔서 감사합니다. – mvexel

0

NSNotificationCenter, MainViewController를 선호하며 UIProgressBar를 관찰하고 업데이트합니다.

FlickrImage의 객체 MainViewController을 유지하고