|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
又盲看一些关于Objective-C的一些语法基础和规则。之前有一定的C和C++还有Java的基础,所以看起来还是不会很吃力的,各种语言的思想相差还是不会很大的。CoreData是苹果针对Mac和iOS平台开辟的一个框架,次要用来贮存数据。对良多开辟者来讲,CoreData对照简单动手,但很难精晓,假如没有准确的进修办法,你将很难真正了解它,更不必说精晓了。
<br>
原文:AvoidingTenBigMistakesiOSDevelopersMakewithCoreData
感激会员dingdaojun的校正。
CoreData是苹果针对Mac和iOS平台开辟的一个框架,次要用来贮存数据。对良多开辟者来讲,CoreData对照简单动手,但很难精晓,假如没有准确的进修办法,你将很难真正了解它,更不必说精晓了。良多开辟者经常在这方面犯一些毛病,而这篇文章列出了开辟者在iOS开辟过程当中利用CoreData罕见的一些毛病,并对怎样制止这些毛病举行了剖析。
1.不懂得关头术语
关于iOS开辟者来讲,会利用CoreData是一项必备妙技。没有它,良多app都不会存在。当在互联网上到处搜刮CoreData进修教程,你很简单被林林总总的术语吓倒。现实上年夜部分进修教程都起首假定你已晓得了这些术语,而假如你不懂得这些术语,那将会堕入狐疑中。以是起首要晓得关头的术语。这里有一个备忘单,能够用在进修CoreData的过程当中,这份备忘单展现了关头的词组:
<br>
在今后的进修过程当中,你会碰到更多的术语,但这些是初学者必要懂得的最基础的部分。
2.完整无视CoreData
当一项手艺以难学“出名”时,你大概会疏忽它,出格是当你工夫不敷,急着把app做出来的时分。
CoreData贮存app数据的一个罕见替换选择是利用XML属性列表,固然属性列表可让你明天的事情变得轻松,但它们也会随后回过火来咬你一口。不管什么时候你编纂属性列表,产生的变更都是原子性的。这意味着即使是很小的变动请求,全部文件城市被加载到内存中,然后在保留的时分,全部文件城市被写回到硬盘。
跟着数据量的增加,app也会变得愈来愈慢。可是假如你基于SQLite数据库利用CoreData时,这些功能成绩就不会困扰你。如许能够坚持低内存占用,以包管app疾速呼应,并避免app因内存压力过年夜而溃散。实质上说,CoreData之以是比属性类表更有扩大性的缘故原由是它撑持利用数据库举行耐久性贮存。可扩大性并非CoreData的独一上风,利用干系把数据构造进实体布局才是其壮大的地方。好比,思索利用以下实体来代表一个义务:
<br>
该义务实体包括一个称号和subtask_name属性。当从义务实体中创立办理对象时,它将会有一个称号和subtask_name属性。
不依附干系,这个数据模子仅撑持一个subtask,如今思索以下实体:
<br>
带有双箭头的线标明Taskentity能够对应多个Subtaskentity干系,这意味着一个义务能够有多个子义务,更不用说触及到的父义务也能经由过程逆干系被包括出去。这个天真性不但便利,更节俭了数据库的空间,由于父义务称号仅仅只需贮存一次。假如你想要更进一步,让义务有子义务的子义务,下一步该怎样办?思索下从头构建以下义务实体:
<br>
模子如今撑持无线深度的子义务,由于义务实体联系关系的是其自己!CoreData的可扩大性和天真性还只是其上风中很少的一部分。CoreData其实不仅仅使用干系数据库的上风,并且你不用写任何SQL语句来利用它。CoreData替你承当了义务,而且为你主动优化了天生的SQL语句。
我还没有深切研讨CoreData的其他代价方面,好比模子版本把持、迁徙、考证和变动办理和iCloud同步等等。假如有任何值得你投进工夫的iOS框架,那就是CoreData。
3.不利用模子版本把持和迁徙
假如你已编纂了一个办理对象模子,你大概已犯了以下毛病:
“此前用来翻开store的模子不兼容之前用来创立store的模子”
当你创立数据耐久化存储,它是基于一个特定的办理对象模子的。假如模子的布局产生了变更,那末耐久化存储就必需更新以婚配。假如不这么做,store将会是不兼容的,而且不克不及翻开。假如用户正利用的存储是基于你的没有利用版本把持的模子,那末app必定会溃散。
为了确保模子迁徙历程一般举行,你必要确保你在编纂模子前十分当心地增加了模子版本。
附注:一些变更,好比属性默许、无效性划定规矩和猎取哀求模板都能够被简化。
4.过量利用版本把持和迁徙
一旦开辟者懂得到保持办理对象模子版本的浅易,一些开辟者难免会太过利用。这会发生一个太过庞大化的版本汗青纪录,假如每次变动都增加版本,这只会减缓模子的迁徙。
在你公布CoreDataapp到AppStore之前,你能够疏忽版本把持,并按你喜好的那样编纂模子。为制止“thestoreisincompatible”毛病,能够复杂地从开辟设备上删除app,并再次在Xcode中运转。利用更新的模子部署一个新的耐久化贮存,就能够办理溃散成绩。一旦你把modelversion1公布到AppStore,你一切的用户将会有version1的耐久化存储。从这一点下去说,假如更新模子则必需增加一个新版本。我们假定你的用户正利用modelversion1。当开辟一个更新版的app,你已增加了modelversions2,3和4。利用以下小技能能够削减版本汗青,而不必公布modelversions2,3,4...
删除model2的内容
复制model4内容至model2
设置model2为以后model
删除model4
固然,你必要思索model1中的实体怎样映照到更主要的model2中,特别在你没有利用轻量级迁徙时。加倍具体的关于model版本把持和迁徙,可检察“LearningCoreDataforiOS”这一个完全章节。
5.把统统留在内存中
你次要存眷功效和特征,以是你很简单健忘那些不那末诱人的主题,好比坚持低内存占用。有些开辟者会在举行功能测试前急仓促地公布使用,特别是停止刻日所迫的情形下。不外还好我们仍有一些措施帮你坚持低内存占用。
当你办理对象时,在内存方面可以使用办理对象context。一旦你完成了办理对象,你应当经由过程挪用以下NSManagedObjectContext实例办法之一来移除它们。
经由过程重置来从context中移除一切办理对象。
利用refreshObject:mergeChanges并传进参数NO从context中移除特定的对象。
利用以上恣意一个办法能够确保未利用的对象没有华侈空间。为了在context中进步对象数量的可见性,可纪录[[contextregisteredObjects]count]了局以便利在把持台中调试。
6.计划一个低质量的ManagedObjectModel
假如你贮存照片、音频大概视频,你在模子计划上要非常当心。记着关头的一点是当你把managedobject带进context时,你正把一切数据一并带进内存中。比方,假如一个managedobject带有一个图象属性,该属性存储了一张很年夜的图片,同时一个表格视图利用它来创立浩瀚实体对象并添补单位格,那末app功能就会遭到影响。立即你利用一个取得了局的把持器,你仍必要一次加载良多高分率的图片,这个操纵不会立即实行。为懂得决这一成绩,持有大批对象的属性应当被决裂进一个联系关系实体。依照这个办法,大批对象能够被耐久化存储。假如你必要在tableview中展现照片,你应当利用主动天生缩略图取代。
7.不提早加载数据
当你把模子加载进一个更新的app时,要注重不要不测地加载一个基于旧模子的默许数据存储。假如你这么做了,那末对一些用户来讲,大概会在运转使用的时分招致溃散。这个威逼能够从基本上制止开辟者加载一个默许的数据存储。
假如有默许数据包括在app中,那app就更简单进修和利用了。一个程序越简单利用,那末用户就越有大概持续利用它。用户利用一款使用的工夫越长,那末用户传布它的时机就越年夜,最初也会提拔使用潜伏的发卖情形。为了不在供应默许数据的情形下呈现的更新时溃散征象,你必要一个好的测试战略。
别的,你也必要深入、正确地舆解你想把甚么样的模子版本和存储公布到AppStore。你应当部署一个未改动的AppStore使用版本到你的设备上,增加数据,然后完全测试晋级历程。
8.只利用单一的Contexts
CoreData的完成最少必要一个context在主线程上操纵。用户接口也需运转在主线程,因而任何减缓主线程的举动城市下降程序的呼应才能。固然利用一个context十分简单,可是功能成绩会寂静呈现,除非你的数据设置十分小。好比,假如你想要天生数据缩略图,大概导进一些数据,app就会这些过程当中呈现堵塞征象。
自从iOS5今后,办理多个context已变得十分简单了。如今你能够设置一个context层级,并在前台和背景运转一些contexts。经由过程设置背景context作为前台context的父类,你就能够完成背景保留。经由过程设置背景context作为前台context的子类,你就能够像导进对象一样导进context来主动更新用户接口.
9.不睬解iCloudIntegration的范围性
iOS7公布今后,CoreData集成iCloud的完成变得加倍复杂。iCloud一个关头性的限定是它的数据被束缚在一个iCloud账户中。因为iCloud账户是与用户设备的各个方面交织在一同,以是分享iCloud账户是不实在际的,不保举的。这意味着iCloud不克不及被用来共享。好比,假定一名丈夫和老婆想要在统一个购物列表上列出物品,这一点以后对iCloud来讲也是不成能的。
除账号限定,iCloud也不撑持orderedrelationships,也限定你的轻量级的model迁徙。跳出这个圈子思索,假如你对app利用的搜集剖析统计对照感乐趣,你能够思索利用Backend-as-a-Service(BaaS)。
10.不思索现有的客户数据集成iCloud
在iOS7中,iCloud集成CoreData已简单了良多,良多开辟者有信念在使用中撑持它,此前用它来托管可贵的用户数据其实不不乱。这招致了良多现有的app唯一当地贮存,好比我本人的‘Teamwork’app。
iOS7中iCloud主要的简化之一是fallbackstore的引进,它同意在iCloudaccounts和iCloudDocuments和Data之间无缝过渡。用户可使用撑持iCloud的app,即使他们没有任何收集毗连,并在有可用收集时把数据集成到iCloud中。
固然这有点难以想象,基于iOS7之前版本开辟的使用中,用于贮存用户数据的当地存储计划都应当被忘记。
假如你仅翻开iCloud,那你将利用一个分歧的贮存,而且你将必要把用户的当地数据兼并到iCloud。在你实验把用户数据集成到iCloud之前,你必要反省以下几点:
用户注册了iCloud吗?
用户想要在app中利用iCloud吗?
用户但愿把当地数据兼并到iCloud吗?
由于封闭文档写的相当好在遇到新框架的时候弄明白框架的功能去文档里搜搜框架的ProgrammingGuide很有用要弄明白框架类的继承结构写iOS的程序不一定都是用OBJC |
|