仓酷云

标题: IOS编程:iOS KVC & KVO仓酷云 [打印本页]

作者: 山那边是海    时间: 2015-1-18 11:35
标题: IOS编程:iOS KVC & KVO仓酷云
用代码控制view意思他们玩的都是高科技IB都是垃圾很多人也纠结到底用不用IB的确很多时候IB灵活度不行但是不需要灵活度的时候还不用IB那不是装X吗要是没人用苹果还开发IB干嘛早去掉了IB在很多时候节省很多工作量UINavigationController再说说NavigationController刚接触开发的时候不明白View和View之间怎么切换的KeyValueCoding

KeyValueCoding是cocoa的一个尺度构成部分,它能让我们能够经由过程name(key)的体例会见property,不用挪用明白的propertyaccssor,如我们有个property叫做foo,我们能够foo间接会见它,一样我们也能够用KVC来完成[ObjectvalueForKey:@“foo”],有同砚就会问了,如许做有甚么优点呢?次要的优点就是来削减我们的代码量。
上面我们来看看几个例子,就分明了KVO的用法亲睦处了,假定如许个类叫做People,
  1. 123456
复制代码
  1. @interfacePeople:NSObject@property(nonatomic,strong)NSString*name;@property(nonatomic,strong)NSNumber*age;@end
复制代码


场景1,apple官网的一个例子,当我们必要统计良多People的时分,每行是一团体的实例,而且有2列属性,name,age,这时候候我们能够会如许做,
  1. 123456789101112
复制代码
  1. -(id)tableView:(NSTableView*)tableviewobjectValueForTableColumn:(id)columnrow:(NSInteger)row{People*people=[peoleArrayobjectAtIndex:row];if([[columnidentifier]isEqualToString:@"name"]){return[peoplename];}if([[columnidentifier]isEqualToString:@"age"]){return[peopleage];}//Andsoon.}
复制代码


一样我们也能够用KVC,匡助我们化简这些if,由于name,age实在都是property,我们能够间接经由过程key来会见,以是收拾事后是
  1. 12
复制代码
  1. People*people=[peopleArrayobjectAtIndex:row];return[peoplevalueForKey:[columnidentifier]];
复制代码


场景2,这下我们有了server,server的某个api(listPeople??),会前往我们json格局一个数组,内里包括如许dict{name:xx,age:xx}如许的数据,我们但愿用这些dict数据机关出我们的people来,一般我们的做法是,为我们People类写一个staticfactory办法专门用来处置dict来,把dict内里的数据掏出来,然后创立个空的People对象,然后顺次设置property。但是当如许相似People的与server交互的类多了,我们就要为每一个类都要加上如许的wrapper,是不是有种复杂举措来设置如许的属性,固然就是我们的KVC了。
  1. 123456789
复制代码
  1. -(id)initWithDictionary:(NSMutableDictionary*)jsonObject{if((self=[superinit])){[selfinit];[selfsetValuesForKeysWithDictionary:jsonObject];}returnself;}
复制代码


setValuesForKeysWithDictionary,会为我们把和dictionary的key名字不异的classproerty设置上dict中key对应的value,是否是很便利呀,可是有同砚又要问了假如json内里的某些key就是和object的property名字纷歧样呢,大概有些server前往的字段是objc保存字如”id”,“description”等,我们也但愿也mapdicttoobject,这时候候我们就必要用上setValue:forUndefinedKey,由于假如我们不处置这些UndefinedKey,仍是用setValuesForKeysWithDictionary就会抛出非常。
  1. 123456789
复制代码
  1. -(void)setValue:(id)valueforUndefinedKey:(NSString*)key{if([keyisEqualToString:@"nameXXX"])self.name=value;if([keyisEqualToString:@"ageXXX"])self.age=value;else[supersetValue:valueforKey:key];}
复制代码


以是只需重载这个办法,就能够处置了那些没法跟property相婚配的key了,默许的完成是抛出一个NSUndefinedKeyException,又有同砚提问了假如这时候候server前往的People有了内嵌的json(如Products{product1{count:xx,sumPrice:xx}},product2{}….),又该怎样办,能把这个内嵌的json转化成我们的客户真个Product类嘛,固然能够这时候候就必要重载setValue:forKey,独自处置”Products”这个key,把它wrapper成我们必要的class
  1. @interfacePeople:NSObject@property(nonatomic,strong)NSString*name;@property(nonatomic,strong)NSNumber*age;@end0
复制代码
  1. @interfacePeople:NSObject@property(nonatomic,strong)NSString*name;@property(nonatomic,strong)NSNumber*age;@end1
复制代码


场景3,我们必要把一个数组里的People的名字的首字母年夜写,而且把新的名字存进新的数组,这时候候一般做法会是遍历全部数组,然后把每一个People的name掏出来,挪用capitalizedString然后把新的String到场新的数组中。有了KVC就有了新做法:
  1. @interfacePeople:NSObject@property(nonatomic,strong)NSString*name;@property(nonatomic,strong)NSNumber*age;@end2
复制代码
  1. @interfacePeople:NSObject@property(nonatomic,strong)NSString*name;@property(nonatomic,strong)NSNumber*age;@end3
复制代码


我们看到valueForKeyPath,为何用valueForKeyPath,不必valueForKey,由于valueForKeyPath能够传送干系,比方这里是每一个People的nameproperty的String的capitalizedStringproperty,而valueForKey不克不及传送如许的干系,以是关于dict内里的dict,我们也只能用valueForKeyPath。这里我们也看到KVC关于array(set),做了特别处置,不是复杂操纵collection上,而是针对这些collection内里的元素举行操纵,一样KVC也供应更多地操纵,比方@sum这些针对collection,有乐趣的同砚能够往用下。
场景4,当我们实行NSArray*products=[peoplevalueForKey:@“products”],我们但愿的是[peopleproducts],但是people没有如许的办法,KVC又会为我们带来些甚么呢?
复杂来讲,valueForKey,会给我们带来一个代办署理array,假如我们完成了某些办法,上诉的这些办法只是针对NSArray,关于mutable的collection,我们还必要供应其他办法的完成才行。
KeyValueObserving

KeyValueObserving,望文生义就是一种observer形式用于监听property的变更,KVO跟NSNotification有良多类似的中央,用addObserver:forKeyPath:options:context:往startobserver,用removeObserver:forKeyPath:context往stopobserver,回调就是observeValueForKeyPath:ofObject:change:context:。
  1. @interfacePeople:NSObject@property(nonatomic,strong)NSString*name;@property(nonatomic,strong)NSNumber*age;@end4
复制代码
  1. @interfacePeople:NSObject@property(nonatomic,strong)NSString*name;@property(nonatomic,strong)NSNumber*age;@end5
复制代码


关于KVO来讲,我们要做的只是复杂update我们的property数据,不必要像NSNotificationCenter那样体贴是不是有人在监听你的哀求,假如没有人监听该怎样办,一切addObserver,removeObserver,callback都是想要监听的你的property的class做的事变。已经做个项目,用NSNotificationCenterpostNotification在一个networkcallback内里,但是这时候候由于最早的addObserver的class被开释了,接着天生的addObserver的class,就承受到了上一个observer该监听的事务,以是形成了毛病,当时候的办理计划是为addObservekey做unique,不会2次addObserver的key是不异的,可是有了KVO,我们一样能够用KVO来完成,当addOberver的的objectremove的时分,就不会有如许的callback被挪用了。

照着书上的例子,一个一个做下来,只要不是文盲,就都会的呀,没有体现我的一点点个人价值。所以我决定了,不能再这样下去
作者: 活着的死人    时间: 2015-1-27 12:04
众多研发人员积极参与到iOS平台的开发中来也就不足为奇了。
作者: 海妖    时间: 2015-2-3 13:49
自从苹果公司开放iOS SDK以来,大量的国内外的软件开发者将关注的目光聚集在苹果的iOS平台上。由于iPhone和iPad自一出现就给人带来了颠覆性的感觉
作者: 小妖女    时间: 2015-2-8 15:31
培训的时候很痛苦,每天要待12个小时,上午讲课,下午和晚自习解决作业,看文档,学习的时候感觉就是资料太少,而且看着资料也不明所以,非常痛苦,
作者: 分手快乐    时间: 2015-2-18 06:52
才在自己的Windows电脑上安装配置成功了一个完美的Mac OS X Lion(10.7.4)系统,而且下载了Xcode4.5的最新版本。虽然不能实机调试,但是作为iOS开发学习已经非常完美了。
作者: 变相怪杰    时间: 2015-2-24 21:25
每个行业都一样,想要一天学有所成是不可能的,一定要做好努力的准备,做ios不是简单的学会oc语言。不怕多走弯路,就怕不肯动手。
作者: 灵魂腐蚀    时间: 2015-2-27 12:39
培训时可以选择安卓,iOS,Java,因为实习的时候我选了安卓,当时实习时间只有三周,学的晕头转向,而java我也没学过,iOS的基础是C语言,这个大学里还是学过的,于是选择了iOS。
作者: 再见西城    时间: 2015-3-8 14:46
在百度搜索你想要了解的类名(苹果的cocoa和cocoatouch框架的类名很有特点很容易搜到,前缀都是NS or UI),看别人写的博客详解
作者: admin    时间: 2015-3-11 20:19
还有开发工具是用Xcode,是在Mac系统的,你多摸索一下就可以开发简单的应用了,建议你买一本iphone开发秘籍第二版看看,希望可以帮到你,谢谢。
作者: 山那边是海    时间: 2015-3-17 02:09
要学会通过各种方法将面前的事情变成自己感兴趣的,那专研起来就不会是无聊和折磨了。
作者: 冷月葬花魂    时间: 2015-3-23 13:39
看《iPhone 4与iPad开发基础教程》,跟着一步步来
作者: 愤怒的大鸟    时间: 2015-3-27 22:19
iPhone文件系统NSFileManager讲解是本文要介绍的内容,主要是通过iphone文件系统来学习NSFileManager的使用方法,具体内容来看本文详解。
作者: 柔情似水    时间: 2015-4-9 09:25
特别是在校的学生,都存在一个小小的尴尬——虽然学习iOS开发的热情高涨,但由于没有多余的银子购买昂贵的Mac电脑而踟蹰不前。其实,针对初学者,如果想进入iOS开发的天地
作者: 再现理想    时间: 2015-4-11 06:17
近期由于IOS7的发布,所以应用的适配潮可谓是都搞的锣鼓喧天,甚是热闹,因此呢,因适配IOS7而产生的问题也是铺天盖地的卷来,
作者: 兰色精灵    时间: 2015-4-16 01:37
到大三时,学院与我去培训的机构成立了实习基地,并让我们寒假去实习了一段时间,感觉还不错,于是在大四的时候去培训了
作者: 因胸联盟    时间: 2015-4-18 00:52
看完这个你就可以有多种选择来踏入做应用的阶段
作者: 乐观    时间: 2015-4-18 16:05
我也从简单的状态栏适配开始,先研究了下关于状态栏的适配,特总结如下,供广大网友一起讨论交流。
作者: 金色的骷髅    时间: 2015-4-26 04:11
在百度搜索你想要了解的类名(苹果的cocoa和cocoatouch框架的类名很有特点很容易搜到,前缀都是NS or UI),看别人写的博客详解
作者: 仓酷云    时间: 2015-6-5 19:43
特别是在校的学生,都存在一个小小的尴尬——虽然学习iOS开发的热情高涨,但由于没有多余的银子购买昂贵的Mac电脑而踟蹰不前。其实,针对初学者,如果想进入iOS开发的天地
作者: 第二个灵魂    时间: 2015-7-11 07:36
其实在培训的过程中,学习到最多的就是查资料的方式,当时感觉老师好坑,什么都不告诉我们,让我们自己去查,但是现在觉得还是要自己解决问题,这样才能理解的更加深入。




欢迎光临 仓酷云 (http://www.ckuyun.com/) Powered by Discuz! X3.2