docs: Electron

This commit is contained in:
杭城小刘
2020-05-04 02:51:19 +08:00
parent 79f10acba2
commit 8dbcff87ed
42 changed files with 851 additions and 33 deletions

View File

@@ -1,10 +1,12 @@
# KVC && KVO
## 基本用法
### 字典快速赋值
KVC 可以将字典里面和 model 同名的 property 进行快速赋值 **setValuesForKeysWithDictionary**
## 一、基本用法-字典快速赋值
KVC 可以将字典里面和 model 同名的 property 进行快速赋值 `setValuesForKeysWithDictionary`
```objective-c
//前提model 中的各个 property 必须和 NSDictionary 中的属性一致
@@ -22,7 +24,8 @@ KVC 可以将字典里面和 model 同名的 property 进行快速赋值 **setVa
运行上面的代码,代码不崩溃,只不过在输出值的时候输出了 null
- 情况二:在 NSDictionary 中存在某个值,但是在 model 里面没有值
运行后编译成功,但是代码奔溃掉。原因是 KVC 。所以我们只需要实现这么一个方法。甚至不需要写函数体部分
```
@@ -62,7 +65,8 @@ NSMutableArray *hobbies = [_person mutableArrayValueForKeyPath:@"hobbies"];
```
- 情况五: 注册依赖键.
KVO 可以观察属性的二级属性对象的所有属性变化。说人话就是“假如 Person 类有个 Dog 类Dog 类有 name、fur、weight 等属性,我们给 Person 的 Dog 属性观察,假如 Dog 的任何属性变化是Person 的观察者对象都可以拿到当前的变化值。我们只需要在 Person 中写下面的方法即可”
```
@@ -88,7 +92,9 @@ self.person.dog.weight = 50;
```
## KVO 的本质
## 二、 KVO 的本质
kVO 是Objective-C 对观察者模式的实现。也是 Cocoa Binding 的基础。
@@ -96,16 +102,14 @@ kVO 是Objective-C 对观察者模式的实现。也是 Cocoa Binding 的基础
1. KVO 观察者和属性被观察的对象之间不是强引用的关系
2. KVO 的触发分为`自动触发模式`和`手动触发模式`2种。通常我们使用的都是自动通知注册观察者之后当条件触发的时候会自动调用`-(void)observeValueForKeyPath...`

如果需要实现手动通知,我们需要使用下面的方法
2. KVO 的触发分为`自动触发模式`和`手动触发模式`2种。通常我们使用的都是自动通知注册观察者之后当条件触发的时候会自动调用 `-(void)observeValueForKeyPath`。如果需要实现手动通知,我们需要使用下面的方法
```
```Objective-c
+ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)key {
return NO;
}
```
3. 若类有实例变量 NSString *_foo 调用 setValue:forKey: 是以 foo 还是 _foo 作为 key
3. 若类有实例变量 NSString *_foo 调用 setValue:forKey: 是以 foo 还是 _foo 作为 key
都可以
@@ -120,8 +124,7 @@ kVO 是Objective-C 对观察者模式的实现。也是 Cocoa Binding 的基础
### 实现机制
## 三、 实现机制
> Automatic key-value observing is implemented using a technique called isa-swizzling... When an observer is registered for an attribute of an object the isa pointer of the observed object is modified, pointing to an intermediate class rather than at the true class ...
@@ -149,7 +152,8 @@ Apple 文档告诉我们:被观察对象的 `isa指针` 会指向一个中间
关于分类与子类的关系可以看看我之前的 [文章](1.50.md).
### 模拟实现系统的 KVO
## 四、 模拟实现系统的 KVO
1. 创建被观察对象的子类
2. 重写观察对象属性的 set 方法,同时调用 `willChangeValueForKey、didChangeValueForKey`
@@ -246,11 +250,12 @@ void setName (id self, SEL _cmd, NSString *name) {
```
### KVO 的缺陷
KVO 虽然很强大,你只能重写 `-observeValueForKeyPath:ofObject:change:context: ` 来获得通知,想要提供自定义的 selector ,不行;想要传入一个 block没门儿。感觉如果加入 block 就更棒了。
KVO 的缺陷:
### KVO 的改装
KVO 虽然很强大,你只能重写 `-observeValueForKeyPath:ofObject:change:context: ` 来获得通知,想要提供自定义的 selector ,不行;想要传入一个 block 没门儿。感觉如果加入 block 就更棒了。
KVO 的改装:
看到官方的做法并不是很方便使用,我们看到无数的优秀框架都支持 block 特性,比如 AFNetworking ,所以我们可以将系统的 KVO 改装成支持 block。