kvo

消息机制,KVC,KVO

假装没事ソ 提交于 2020-01-07 13:11:25
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> iOS 提供了一种 "同步的" 消息通知机制,观察者只要向消息中心注册, 即可接受其他对象发送来的消息,消息发送者和消息接受者两者可以互相一无所知,完全解耦。 这种消息通知机制可以应用于任意时间和任何对象,观察者可以有多个,所以消息具有广播的性质,只是需要注意的是,观察者向消息中心注册以后,在不需要接受消息时需要向消息中心注销,这种消息广播机制是典型的“Observer”模式。 这个要求其实也很容易实现. 每个运行中的application都有一个NSNotificationCenter的成员变量,它的功能就类似公共栏. 对象注册关注某个确定的notification(如果有人捡到一只小狗,就去告诉我). 我们把这些注册对象叫做 observer. 其它的一些对象会给center发送notifications(我捡到了一只小狗). center将该notifications转发给所有注册对该notification感兴趣的对象. 我们把这些发送notification的对象叫做 poster 消息机制常常用于在向服务器端请求数据或者提交数据的场景,在和服务器端成功交互后,需要处理服务器端返回的数据,或发送响应消息等,就需要用到消息机制。 KVC:Key-Value Coding,直译是:键值编码。简单来讲

细说KVO和Notification

余生颓废 提交于 2020-01-07 10:34:42
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 做iOS开发已经不短时间了,忙于项目,遇见问题,就去Google,忘记了积累,最近深知其中的危害,深深体会到 经验不在于年限而在于积累 这个道理。 从遇见的问题说起,想实现时刻监控UITextField有无文本这样一个功能,听起来很简单,感觉做起来也很容易,但就是这么个简单的问题,让我花费了很长时间,很是懊恼,决定重新审视下自己,整理下这方面的知识,来提高自己!好了废话少说,进入正题! 实现功能 监控 UITextField是否有输入文本 从而实现按钮是否可以点击 解决方案 Notification 代码实现 //文本框 UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(20, 100, 280, 50)]; textField.tag = 888; [textField setClearButtonMode:UITextFieldViewModeWhileEditing]; [textField setContentVerticalAlignment:UIControlContentVerticalAlignmentCenter]; textField.layer.borderWidth = 0.5f; /

KVO 底层原理详解

。_饼干妹妹 提交于 2019-12-25 00:59:19
基本原理-> 给一个对象的属性添加监听 当属性值发生变化时 会触发监听器的监听的方法 #import "ViewController.h" #import "Person.h" @interface ViewController () @property (nonatomic, strong) Person *p; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; self.p=[[Person alloc]init]; self.p.age=5; [self.p addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew context:@"额外信息"]; // Do any additional setup after loading the view. } -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ self.p.age=10; } -(void)observeValueForKeyPath:(NSString *

WKWebView简单使用-(KVO)加载进度条,标题,返回

ぐ巨炮叔叔 提交于 2019-12-04 06:44:10
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{//如果将cangoback写在此方法里面只能执行一次,如果当前网页跳转不是新的web就不能执行 } //通过KVO的方式获取进度条,title,是否可以返回 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{ if ([keyPath isEqualToString:@"title"]) { self.navigationItem.title = self.isShowTitle ? self.webView.title : @""; }else if ([keyPath isEqualToString:@"estimatedProgress"]){ if (object == self.webView) { [_progressView setProgress:self.webView.estimatedProgress animated:true]; if (self

IOS 如何选择delegate、notification、KVO?

僤鯓⒐⒋嵵緔 提交于 2019-12-04 03:55:51
前面分别讲了delegate、notification和KVO的实现原理,以及实际使用步骤,我们心中不禁有个疑问,他们的功能比较类似,那么在实际的编程中,如何选择这些方式呢? 在网上看到一个博客上详细的分析了三者之间的区别以及各自的优势,博文地址为 http://blog.shinetech.com/2011/06/14/delegation-notification-and-observation/ ,因为博文是用英文写的,下面将其翻译成中文。 在开发ios应用的时候,我们会经常遇到一个常见的问题:在不过分耦合的前提下,controllers间怎么进行通信。在IOS应用不断的出现三种模式来实现这种通信: 1.委托delegation; 2.通知中心Notification Center; 3.键值观察key value observing,KVO 因此,那为什么我们需要这些模式以及什么时候用它以及什么时候不用它。 下面完全根据我的开发经验来讨论这三中模式。我将讨论为什么我觉得某种模式要好于另外一种模式以及为什么我觉得在一定的环境下某中模式比较好。我给出的这些原因并不是圣经,而仅仅是个人观点。如果你有什么不同的观点或者还可以进行补充的地方,可以联系我,一起讨论。 上面的三种模式是什么? 三种模式都是一个对象传递事件给另外一个对象,并且不要他们有耦合

iOS经典面试题

做~自己de王妃 提交于 2019-12-03 04:50:46
iOS经典面试题 前言 写这篇文章的目的是因为前两天同学想应聘iOS开发,从网上找了iOS 面试题 和答案让我帮忙看看。我扫了一眼,倒吸了一口冷气,仔细一看,气的发抖。整篇题目30多个没有一个答案是对的,总结这篇面试题的作者对iOS机制根本就是一知半解就敢发到网上,不管有心还是无心都是坑害新人。所以在这里总结一下这几年面试别人和被别人面试遇到的一些我认为比较好的基础题目分享给大家,进阶题目在后续补充。我的理解如果有错漏请一定指出,非常感谢! 从12年开始做面试官到现在已经三个年头了,这期面过很多形形色色的开发,有腾讯的、有百度的、有小公司的、有做外包的,还有完全没有代码能力来做管理的。给我的感觉是百度出品的技术能力最好,基础知识、技术细节掌握的非常的扎实并且自信。腾讯出品技术细节上也非常厉害,平均来说比百度差一些,但是解决问题的能力非常强,思维很活跃大局观好。小公司、外包公司的同学技术细节、基础知识要差一些。我个人是非常反对以出身论英雄BAT出品就一定比其他公司的优秀,只能说BAT提供的技术氛围更好,你可以跟更多优秀的人共事,相比小公司技术进步更容易些。 这期间我也面了很多互联网公司,腾讯、百度、阿里、快播还有其他很多中小型公司,给我的感觉是中国整体的互联网面试官的态度非常糟糕,面试官经常性习惯性的迟到,理由有开会啦、在吃饭啦,最离谱的是没有任何理由就让你在那里等

Core Data: Emitting KVO notifications for transient, derived properties

匿名 (未验证) 提交于 2019-12-03 03:04:01
可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试): 问题: I have Parent entity with a custom class that has a transient and derived (read only) property called DerivedProperty . The value of DerivedProperty is dependent on the value of Parent.IndependentProperty1 and so whenever IndependentProperty1 changes, the value of DerivedProperty will change. However, Parent has a to-many relationship to Child (called children ) and DerivedProperty is also dependent on the value of IndependentProperty2 in all of Parent 's Child objects. So whenever IndependentProperty1 of Parent or IndependentProperty2 of

NSMutableDictionary KVO

匿名 (未验证) 提交于 2019-12-03 01:47:02
可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试): 由 翻译 强力驱动 问题: I'm trying to observe changes in dictionary using KVO. Example: dictionary = [ NSMutableDictionary new ]; [ dictionary setObject :@ "test1" forKey :@ "key1" ]; [ dictionary setObject :@ "test2" forKey :@ "key2" ]; [ dictionary setObject :@ "test3" forKey :@ "key1" ]; I'd love to be able to hook an observer for whenever a value is added to the dictionary. removed, or replaced (ie in the above cases, whenever any of the setObject methods are called) So in conclusion: I want a function to have - ( void ) observeValueForKeyPath :(

初探KVO

匿名 (未验证) 提交于 2019-12-03 00:22:01
概述 KVO 的具体实现 具体实现代码如下: #import "ViewController.h" #import "Person.h" @interface ViewController () /** p1 */ @property ( strong , nonatomic ) Person *p1; @end @implementation ViewController - ( void )viewDidLoad { super viewDidLoad]; // 1.什么是通知 // 3个对象 self .p1 = [[Person alloc] init]; self .p1 .name = @"p1" ; // KVO是监听对象的属性值的改变的 self .p1 addObserver: self forKeyPath: @"name" options: NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context: nil ]; self .p1 .name = @"123" ; } // 这个方法时属于 NSObject 类的,任何对象都可以作为观察者 - ( void )observeValueForKeyPath:( NSString *)keyPath ofObject:( id

KVO 实践及 FBKVOController 原理

有些话、适合烂在心里 提交于 2019-11-30 12:20:53
本篇简单学习下如何使用 KVO KVO是什么? KVO 是 Object-C 中定义的一个通知机制,其定义了一种对象间监控对方状态的改变,并做出反应的机制。对象可以为自己的属性注册观察者,当这个属性的值发生了改变,系统会对这些注册的观察者做出通知。其用途十分广泛,比方说,你的下载进度条是根据下载百分比决定的,那么,可以通过观察下载百分比的改变,刷新进度条的样式,来直观的反应下载进度等等。 KVO的用法 为对象的属性注册观察者 1234 - (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context observer: 观察者对象. 其必须实现方法 observeValueForKeyPath:ofObject:change:context: . keyPath: 被观察的属性,其不能为 nil . options: 设定通知观察者时传递的属性值,是传改变前的呢,还是改变后的,通常设置为 NSKeyValueObservingOptionNew 。 context: 一些其他的需要传递给观察者的上下文信息,通常设置为 nil 。 观察者接收通知 1234 - (void