一丶KVO Compliance 原始文檔
二丶發(fā)送通知使用介紹:
2.1自動發(fā)送通知;
######2.1.1 set方法
// Call the accessor method.
[account setName:@"Savings"];
######2.1.2 kvc
// Use setValue:forKey:.
[account setValue:@"Savings" forKey:@"name"];
######2.1.3 kvc 路徑法
// Use a key path, where 'account' is a kvc-compliant property of 'document'.
[document setValue:@"Savings" forKeyPath:@"account.name"];
######2.1.3 kvc 獲取一個數(shù)組
// Use mutableArrayValueForKey: to retrieve a relationship proxy object.
Transaction *newTransaction = <#Create a new transaction for the account#>;
NSMutableArray *transactions = [account mutableArrayValueForKey:@"transactions"];
[transactions addObject:newTransaction];
2.2 手動發(fā)送通知
2.2.1控制
+ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)key
{
if ([key isEqualToString:@"想要手動控制的key"])return NO;
return [super automaticallyNotifiesObserversForKey:key];
}
2.2.2 手動發(fā)送
重寫set方法;
- (void)setTmpStr:(NSString *)tmpStr
{
[self willChangeValueForKey:@"tmpStr"];
_tmpStr = tmpStr;
[self didChangeValueForKey:@"tmpStr"];
}
2.2.3 提升性能的手動發(fā)送
- (void)setTmpStr:(NSString *)tmpStr
{
if (![_tmpStr isEqualToString:tmpStr])
{
[self willChangeValueForKey:@"tmpStr"];
_tmpStr = tmpStr;
[self didChangeValueForKey:@"tmpStr"];
}
}
2.2.4 實現(xiàn)一個key修改,多個key同時修改
- (void)setTmpStr:(NSString *)tmpStr
{
if (![_tmpStr isEqualToString:tmpStr])
{
[self willChangeValueForKey:@"tmpStr"];
[self willChangeValueForKey:@"修改發(fā)送的通知1號Key"];
[self willChangeValueForKey:@"修改發(fā)送的通知2號Key"];
_tmpStr = tmpStr;
[self didChangeValueForKey:@"tmpStr"];
[self didChangeValueForKey:@"修改發(fā)送的通知1號Key"];
[self didChangeValueForKey:@"修改發(fā)送的通知2號Key"];
}
}
2.2.5 最后一個,沒用過,簡單介紹
typedef enum NSKeyValueChange : NSUInteger {
NSKeyValueChangeSetting = 1,
NSKeyValueChangeInsertion = 2,
NSKeyValueChangeRemoval = 3,
NSKeyValueChangeReplacement = 4
} NSKeyValueChange;
移除 Transactions 中元素時手動觸發(fā) KVO 例子:
- (void)removeTransactionsAtIndexes:(NSIndexSet *)indexes
{
[self willChange:NSKeyValueChangeRemoval valuesAtIndexes:indexes forKey:@"transactions"];
// Remove the transaction objects at the specified indexes.
[self didChange:NSKeyValueChangeRemoval valuesAtIndexes:indexes forKey:@"transactions"];
}