2017-02-26 1 views
1

내 앱에는 아래에서 볼 수있는 Restaurant 클래스가 있습니다. KVOController을 첨부하고 싶습니다. 하지만 나는 운이 없다. 아래 코드를 첨부하면 충돌이 발생합니다.동기화 된 클래스에 KVO를 추가하는 방법은 무엇입니까?

FBKVOController *KVOController = [FBKVOController controllerWithObserver:self]; 
    self.KVOController = KVOController; 

    [self.KVOController observe:self keyPath:@"[Restaurant current].name.asString" options:NSKeyValueObservingOptionInitial|NSKeyValueObservingOptionNew block:^(id observer, id object, NSDictionary *change) { 
     DDLogDebug(@"Restaurant changed"); 
    }]; 

이렇게 클래스에 KVO를 추가하는 가장 좋은 방법은 무엇입니까?

@implementation Restaurant 

static Restaurant *current = nil; 

+ (Restaurant *)current { 
    @synchronized(self) { 
     if (current == nil) {    
      current = [[Restaurant alloc] initWithId:0]; 
     } 
    } 
    return current; 
} 

- (id)initWithId:(NSInteger)number { 
    self = [super init]; 
    if (self) 
    { 
     ... 
    } 
    return self; 
} 

@end 

답변

0

문제는 @synchronized이 아닙니다. 코드에 몇 가지 문제가 있습니다.

  • 현재 레스토랑이 변경되면 언제 관측하고 싶습니까? 또는 현재 레스토랑의 이름이 바뀌면 (+[Restaurant current]이 아닌 다른 레스토랑 인스턴스를 가리킴). 또는 의 변경 또는 name의 변경으로 인해 발생하는 모든 이름 변경이 가능합니까?
    • 대답에 따라, 당신은 (당신이이 경우 [self class][Restaurant class]에 대한 대안이 될 것이다는 Restaurant 클래스 구현 내부에서이를 설정하지 않는 한) 확실히 observe:[Restaurant class] 또는 observe:[Restaurant instance] 있지만 observe:self을 관찰 할 것 중 하나 .
    • 변경 사항을 관찰하려면 클래스가 KVO-compliant 방식으로 구현되어 있는지 확인해야합니다. 이는 관찰 할 수있는 것에 따라 +[Restaurant current]과 변경된 -[Restaurant name]에 대한 변경을 모두 의미합니다.
  • [Restaurant current].name.asString은 유효한 키 경로가 아닙니다. 유효한 키 경로는 속성 이름 (ASCII, 소문자로 시작하고 공백 없음) 및 점을 구분하는 점 (자세한 내용은 Key-value coding 참조) 만 포함 할 수 있습니다. KVOController에 observe:[Restaurant class]이라고 말하면 키 경로에 남아있는 것은 모두 current.name.asString입니다.
  • 문자열이 아닌 경우 name은 무엇입니까? 그것을 관찰하기 위해 문자열로 변환해야합니까? 이름 변경을 감시하려는 의도 일 경우, current.name을 관찰하는 것으로 충분할 것입니다.

    FBKVOController *kvoController = [FBKVOController controllerWithObserver:self]; 
    [kvoController observe:[Restaurant class] keyPath:@"current.name" ...];` 
    // or 
    [kvoController observe:[Restaurant current] keyPath:@"name" ...];` 
    

    을 그리고 어떤 변화가 관찰로 다시, 그들은 KVO-compliant 할 필요가 :

당신은 가능성이 다음과 같은 두 가지 옵션 중 하나를하게 될 겁니다.