小编ext*_*dom的帖子

为单个KVC更改接收2个KVO通知

我正在使用KVC/KVO为大学项目创建自定义绑定实现(它需要自定义,因为我想做的事情超出了绑定可以做的事情,包括在iOS上运行).

我有一个'绑定控制器',它在一个对象的多个键上注册KVO通知(使用addObserver:forKeyPath:options:context :),我确实收到了通知.但是,我收到了每个更改的两个通知.我有一个解决方法的想法,但我宁愿弄清楚为什么会发生这种情况并纠正它!

有没有人有任何想法为什么会这样?我确定我一次只注册了每个通知,并且取消注册一次会导致两个通知都停止.

谢谢.

编辑:

我有一些代码请求,所以我会把它放进去.目前有点粗糙,它基本上仍然是一个概念证明,所以请耐心等待.

这是我观察的属性之一(我知道它有点奇怪,但这个类本质上暴露了NSManagedObject的某些属性作为自身的属性):

- (void)setName:(NSString *)name
{
    [self willChangeValueForKey:@"name"];
    [contact setFirstName:name];
    [self didChangeValueForKey:@"name"];
}
Run Code Online (Sandbox Code Playgroud)

这是我用来观察该属性的代码(确认只运行一次,并且只在一个地方运行):

[viewModel addObserver:self
            forKeyPath:@"name"
               options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionInitial)
               context:viewController];
Run Code Online (Sandbox Code Playgroud)

之后的任何调用都会改变该属性,例如:

viewModel.name = @"Joe";
[viewModel setName: @"Joe"];
[viewModel setValue: @"Joe" forKey: @"name"];
Run Code Online (Sandbox Code Playgroud)

会导致该方法:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
Run Code Online (Sandbox Code Playgroud)

要被调用两次,每次使用相同的参数.

macos cocoa objective-c key-value-observing

17
推荐指数
1
解决办法
3783
查看次数

OCMock:使用排除可选方法的模拟协议

我正在使用OCMock在我的iOS应用程序的测试中创建模拟,我想创建没有实现所有可选方法的模拟协议.

如果不清楚我的意思......这里有一些代码:

// Protocol definition
@protocol MyAwesomeProtocol
    - (void)doThatRequiredThing;
    @optional
    - (void)doThatOptionalThing;
@end

...

// In a test
id mock = [OCMockObject mockObjectForProtocol:@protocol(MyAwesomeProtocol)];

// This should return YES:
[mock respondsToSelector:@selector(doThatRequiredThing)];
// This should return NO:
[mock respondsToSelector:@selector(doThatOptionalThing)];
Run Code Online (Sandbox Code Playgroud)

tdd objective-c ocmock ios

7
推荐指数
1
解决办法
2017
查看次数

标签 统计

objective-c ×2

cocoa ×1

ios ×1

key-value-observing ×1

macos ×1

ocmock ×1

tdd ×1