2017-02-26 5 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:selfobserve:[Restaurant class]またはobserve:[Restaurant instance]を観察したいのですが、間違いではないでしょうどちらか。
    • 変更を観察するには、クラスが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する必要があります。あなたはおそらく次の2つのオプションの1になってしまいます

関連する問題