2013-06-12 3 views
2

UIViewController가로드 될 때 인스턴스가 생성되는 클래스가 있습니다. 특정 이벤트가 발생할 때 ViewController를 업데이트 할 수 있으려면이 클래스의 인스턴스가 필요합니다.Objective-C 모델보기 통신

AViewController.h

@property (weak, nonatomic) IBOutlet UIProgressView *progress; 
@Property (strong, nonatomic) ClassB *classB 
-(void)incrementProgressBar: (NSNumber *)currentProgress; 

AViewController.m

-(void)viewDidLoad 
{ 
    _classB = [ClassB alloc]initWithNonReleventVariable:variable]; 
    [_classB setInstanceViewController:self] 
} 
-(void)incrementProgressBaar: (NSNumber *)currentProgress; 
{ 
    [_progressBar setProgress:[currentProgrsss floatValue] animated:YES]; 
} 

ClassB.h

@property (strong, nonatomic)AViewController *avc; 
@property (nonatomic) double progress; 

ClassB.m

-(void)incrementExerciseProgress 
{ 
    //do some calculations here 
    [self.avc incremtProgressBar:[NSNumber numberWithDouble:_progress]]; 
} 
: 이것은 내가이 달성 한 방법이다

이 코드를 다른 사람으로부터 상속 받았으며 제대로 작동합니다. 그래서 내 질문은 이것이다 : 이것을 달성하는 "올바른"방법인가? 이것이 최선의 방법인지 알고 싶습니다. 그렇지 않으면 내가 그것을 고칠 수있는 일은 그렇게했다. 나는이 프로젝트에 약간의 시간을 할애하여 가능한 한 올바르게 수행하고 싶습니다. 감사.

+3

여기서 ARC 강력한 참조주기를 만들었습니다. 'classB'는'classB'를 강하게 나타내는'avc'를 강력하게 가리 킵니다. 이로 인해 메모리 누수가 발생하고 의도하지 않은 동작이 발생할 수 있습니다. 이 두 가지 속성 중 하나는이 사이클을 피하기 위해 '약함'이 아니라 '강함'이되어야합니다. –

+0

@AaronBrager 네 말이 맞아. 나는 그것을 고쳤다. 고맙습니다. – MichelleJS

답변

3

이렇게하면 두 개의 서로 다른 레이어의 두 클래스간에 높은 커플 링이 도입됩니다. 대신 ClassBDelegate 프로토콜을 만들 수 있습니다.

@protocol ClassBDelegate <NSObject> 
- (void) classB: (ClassB *)class hasIncrementedProgressTo:(NSNumnber *)prgoress; 
@end 

AViewController을 준수하십시오. 이렇게하면 ClassB 컨트롤러 레이어의 변경 사항을 무시할 수 있습니다. ClassB의 인스턴스는 원시 데이터의 변경 사항을 대리인에게 알리기 만하면되며 뷰를 사용하여 변경 사항을 표시하는 것은 뷰 컨트롤러 인 대리자의 작업입니다.

+0

위임은 좋은 해결책이라고 말할 수 있지만 블록을 사용하거나 알림을 게시 할 수도 있습니다 (알림은이 경우 적합하지 않지만). – e1985

+0

개체 간의 커플 링을 줄이는 방법은 여러 가지가 있습니다. 그러나 위임은이 경우 최상의 솔루션이라고 생각합니다. 블록도 훌륭하지만, 어떤 메소드에 대한 콜백으로 더 적합 할 것이다 :'[object doSomethingWithCallBack :^(BOOL 플래그) {....}]'.그러나 객체의 일반적인 이벤트를 처리하는 방법으로 위임을 선호합니다. –

+0

이전에 Delegates를 사용했는데 이것이 의미가 있지만 콜백과 블록을 살펴볼 것입니다. 감사. – MichelleJS

2

그들은 뷰의 이벤트에 영향을받는 변경 가능한 데이터 구조 (예 : NSMutableDictionary)를 공유 할 수 있으며 다른 클래스가 KVO에 의해이 변경 사항을 알리도록 허용하므로 데이터 구조에 의해 완전히 분리됩니다.

    : 당신이 날

    인사말

    을 알고

    루이스 알레한드로

    참조하자 예를 requiere 경우

    KVO 부분은 MAKVONotificationCenter 라이브러리 :

    에 의해 개선 될 수

  • KVO
  • MAKVONotificationCenter
+0

+1. 이 경우 KVO가 좋습니다. –

+0

이것은 흥미 롭습니다. 나는 지금까지 KVO에 대해 들어 본 적이 없기 때문에 좀 더 깊이 들여다 볼 시간을 가질 것이다. – MichelleJS