2017-02-26 33 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]指向不同的餐廳實例)。或者任何形式的名稱更改,無論是由current更改還是name更改引發?
    • 根據不同的答案,你要麼要觀察observe:[Restaurant class]observe:[Restaurant instance],但絕對不是observe:self(除非你設置此功能的Restaurant類裏面執行,在這種情況下[self class][Restaurant class]替代) 。
    • 對於任何可觀察的變化,您必須確保該類以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