第一步,精读 Stephen G. Kochan 的《Objective-C程序设计》:Objective-C语言基础,iOS开发的第一技能就是精通Objective-C; 第二步,有了语言基础,精读 David Mark 的《精通iOS开发》:通过各种单独的项目,熟悉iOS SDK,XCode开发环境,明白MVC、委托等设计模式,通读完后,你就对iOS SDK有了比较全面的认识,各种框架和组件有了一定的认识; 选择性阅读了Matt Neubury 的《iOS程序设计》:本书是iOS最系统的教程,对iOS框架的底层有比较详细的介绍,深刻了我对iOS的理解。如果你是一名不仅仅想使用iOS SDK开发,还想理解底层是怎么运行实现的,那就阅读它。如果没看David Mark的《精通iOS开发》直接阅读这本教程会非常的吃力和枯燥无味,所以我建议在学习的过程中,把它作为资料库来查询,遇到想深入学习的某一方面,就选择性阅读本书的一些章节; 有了上面的一些知识,研究一些github上的优秀的项目或者从cocoaChina上找些感兴趣的代码推荐内容并且阅读源码,最好还可以在自己的DIY项目中使用上它们。还可以阅读Bear Cahill 的《iOS in Practice》:通过9个上架的应用,加深对iOS SDK的认识和理解; 到这时候,就会遇到瓶颈,希望更上一层楼。我自己的做法是通过看公开课或者中国上的开发视频,不是让你重新学习,因为身边没人带,所以这么做让你看到别人是怎么编码,别人的编程思路是什么,并且能将你前段时间学习的内容进一步巩固。 接下来当然是iOS进阶了。可以开始阅读David Mark的另一本畅销书《iOS6开发进阶与实战》,主要深入讲解了Core data,map Kit,Game Kit,iCloud,iOS安全等。 在第5和第6步的过程中,可以一点一点阅读Matt Galloway 的《Effective Objective-C 2.0》:介绍52个编写高质量IOS与OS X代码的方法; 与此同时,要学会使用下面一些中国站和工具,学会使用这些中国站和工具,才能是你的开发之路可持续发展
为企业提供网站设计制作、网站制作、网站优化、网络营销推广、竞价托管、品牌运营等营销获客服务。成都创新互联公司拥有网络营销运营团队,以丰富的互联网营销经验助力企业精准获客,真正落地解决中小企业营销获客难题,做到“让获客更简单”。自创立至今,成功用技术实力解决了企业“网站建设、网络品牌塑造、网络营销”三大难题,同时降低了营销成本,提高了有效客户转化率,获得了众多企业客户的高度认可!
这篇文章主要介绍了实际应用 MVVM 的过程中的一些问题和解决方案
MVVM(Model View ViewModel)是一种 MVC(Model View Controller)的一种变型,来解决 MVC 中庞大复杂的 Controller 难以维护的问题。大致上讲 MVVM 有几个要求:
MVVM 和 MVC 有很多类似的特点,主要的不同有:
另外一点,MVVM 默认 View 和 View Controller 有一个一对一的关系,一般我们把这两个看做一个整体,会以 .swift 文件 和 Storyboard 的形式出现。
View Model 的工作是处理所有的展示数据的逻辑。如果一个 model 中有一个 NSDate 对象, NSDateFormatter 就会在 View Model 中用来设置日期的展示形式。
View Model 不能接触任何用户界面的部分,View Model 文件中不应该 import UIKit ,View Controller 会观察 View Model 去了解什么时候显示新的数据(通过 KVO 或者 FRP(Functional Reactive Programming))
MVVM 和 MVC 有一个共同的弱点:没有清楚的定义应该把网络请求部分放在哪里。在实际操作过程中,我会把网络请求放在 View Model 文件里面,但之后我打算把网络请求放在自己独立的一个类中,View Model 文件会拥有这个对象。
下面我们主要谈一谈实际应用 MVVM 过程中一些挑战:
例如你想构造这样一个常用的界面,有一个 segment control 在屏幕顶部,屏幕的其他部分是一个 collection view,选择不同的 segment,就会展示不同样式的 collection view,元素的排列顺序。我们定义了一个 enum 来枚举所有的排列样式:
那么这个 enum 在 MVVM 模式中应该放在哪里呢?因为这个 enum 决定了数据排列的顺序,每个 cell 中的文字和按钮的 title,这些都属于展示的逻辑,所以这个 enum 看起来应该放在 view model 中。
然而,这些 layout 并不改变要展示的数据,只是决定了要呈现的数据的排列方式和排列顺序,从这个角度上来说 enum 又应该放在 view controller 中。
我的解决方法是把 enum 放在 view model 中,然后在 view model 中加一个对外的 Observable 或者 Signal 来表示使用了哪个 layout,基于用户选择的 segment,view model 更新这个值,然后在 view controller 中根据相应的 layout 改变 collection view 的样式,view controller 也可以根据这个值来决定用哪个 cell reuse identifier
iOS 开发者在用 MVVM 和 FRP 写应用的时候最常见的问题可能就是 ViewModel 怎么把数据展现给 ViewController。当 Model 层的数据发生变化更新的时候,ViewController 需要得到通知然后做出相应的 UI 更新,我们一般会用到两种机制:
第一个选项很吸引人,因为可以在 View Controller 中决定怎么选择观察那些 property。然而,我不推荐在 Swift 中使用第一个选项,因为 Swift 在 KVO 中没有类型检查,你需要对 AnyObject 强制转换类型很多次。
第二个选项是比较 Swift 的方式,基于 Swift 的 generics 特性,signals,sequences,observables 可以支持编译过程中的类型检查。
但有时候在 view model 增加这些 Signals 或者 Observables 有些困难。Swift 的初始化方法对于什么时候对 property 赋值有非常明确的规定。Signals 或者 Observables 需要使用 view model 内部的状态,所以它们必须在 super.init() 之后才能创建,但是另一方面,我们在调用 super.init() 之前保证所有 property 已经被赋值了,包括那些 Signal/Observable property。
这是个先有鸡还是先有蛋的问题。
我采用比较简单的解决方法:定义成 var 的隐式可选类型,这样就可以在 super.init() 之后才给 property 赋值。这不是一个完美的解决办法。我们可以用 lazy var property 的闭包赋值来代替上面的方法。在 Swift 不断完善和更新的过程中,大家也可以探索其他更好的办法。
举一个很常用的例子,用户点击 collection view 中的一个 cell,跳转到详情页面。用户点击的操作应该在 view controller 中处理,具体内容是展现一个新的详情页面。但是 view controller 不能直接接触 models,我们要如何用 MVVM 模式实现这样的用户交互呢?
我的解决方案是利用 Swift 的闭包。首先在 view model 中定义一个闭包:
然后在 view model 中添加一个 property:
接着我需要调用闭包,在 view model 中定义一个view controller 可以调用的函数,这个函数的参数是可以决定使用什么数据,一般情况下常用 index path:
现在当用户选中一个 cell,会调用 view model 中的这个函数,并且传入 index path 参数,view model 决定使用哪个数据,并调用在 view controller 中定义的闭包,例如:
最后一个问题是怎么创建这个 view model。我们需要传递一个闭包给view model 的初始化函数,然后用 lazy loading 来调用 view model 的初始化函数。
第一步:编程入门课
时间预计:4个星期
推荐看公开课,Udacity也行,网易公开课也行,自己找一个面对对象语言(一般是JAVA, C++, Python)的课。我是在网易公开课看的斯坦福的CS106A,学的JAVA。
如果你纯粹学iOS开发,不推荐看哈佛CS50,CS50是给CS系的学生介绍整个计算机世界的框架,讲的内容比较多,进度比较快,对iOS开发其实有点累赘了。(臣妾有点跟不上啊!!)
计划安排是一天一课,看课程要求的书(至少看完一本)及大部分作业。这一阶段重点不是语法,而是以下3个目标。
目标:
1. 让自己对编程这件事感到适应。
写hello world。
怎么写function, 怎么调用function。
全局变量,局部变量这类基本知识点。
都是基本的东西。看看书,写多两个程序就欧啦。
2. 掌握编程语言的基本要素。
编程语言4个要素:
a. 基本的数据类型:整数,实数,character, string, boolean
b. 基本的运算符号:+-×/++--那啥的
c. 怎样输入输出
d. 怎样控制程序:sequence,selection,loop
3. 了解编程范式
面对过程编程。
面向对象编程。
第二步:上手iOS!
时间预计:2星期
强烈推荐CS193P,老头子讲的超级好!我的很多东西(对象思维啥的)是在这里跟着做练习的时候才真正明白的(好啦,也可能是上一堂课练习做得少的原因)。如果等到9月应该itunes U上会开始教iOS 7了。网易公开课的是2010年iOS 5版的,前10堂课,也行。(iTunes U上有完整的课)
CS193P说有prerequisite,一开始被吓到,事实证明还是可以学下去的。头两节课一头雾水,没关系,把itunes U上的课件下载下来,把所有代码打出来,然后一个个元素对应之前学的语言匹配,再不懂先放着,继续学后边的,过几天打多点代码就懂了。
感觉学5、6堂课,一个星期左右就可以开始进入下一阶段自己做东西了。之后用啥学啥,每堂课都有主题的。速度慢点的同学们,这阶段跟我一样准备两个星期吧!
第三步:开发app!
时间预计:2星期(本人...1个半月,实在不好意思说出口)
这个时间就可长可短啦,还包括美工,交互啥的。坚持要用啥学啥的原则,其实就是知道iOS SDK都有什么组件,每个组件有什么function而已。stackoverflow, Github, apple sample code多上,搜索引擎多用。如果有个师傅,这个阶段真的是进步神速。
好的!不出意外,你的第一个app就这么新鲜出炉了!从今天开始,成为一个冷艳逼格高尚的iOS开发者吧!
著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:王霖
链接:
来源:知乎
第一步,精读 Stephen G. Kochan 的《Objective-C程序设计》:Objective-C语言基础,iOS开发的第一技能就是精通Objective-C;
第二步,有了语言基础,精读 David Mark 的《精通iOS开发》:通过各种单独的项目,熟悉iOS SDK,XCode开发环境,明白MVC、委托等设计模式,通读完后,你就对iOS SDK有了比较全面的认识,各种框架和组件有了一定的认识;
第三步,选择性阅读了Matt Neubury 的《iOS程序设计》:本书是iOS最系统的教程,对iOS框架的底层有比较详细的介绍,深刻了我对iOS的理解。如果你是一名不仅仅想使用iOS SDK开发,还想理解底层是怎么运行实现的,那就阅读它。如果没看David Mark的《精通iOS开发》直接阅读这本教程会非常的吃力和枯燥无味,所以我建议在学习的过程中,把它作为资料库来查询,遇到想深入学习的某一方面,就选择性阅读本书的一些章节;
第四步,有了上面的一些知识,研究一些github上的优秀的项目或者从cocoaChina上找些感兴趣的代码推荐内容并且阅读源码,最好还可以在自己的DIY项目中使用上它们。还可以阅读Bear Cahill 的《iOS in Practice》:通过9个上架的应用,加深对iOS SDK的认识和理解;
第五步,到这时候,就会遇到瓶颈,希望更上一层楼。我自己的做法是通过看公开课或者网上的开发视频,不是让你重新学习,因为身边没人带,所以这么做让你看到别人是怎么编码,别人的编程思路是什么,并且能将你前段时间学习的内容进一步巩固。
第六步,接下来当然是iOS进阶了。可以开始阅读David Mark的另一本畅销书《iOS6开发进阶与实战》,主要深入讲解了Core data,map Kit,Game Kit,iCloud,iOS安全等。
第七步,在第5和第6步的过程中,可以一点一点阅读Matt Galloway 的《Effective Objective-C 2.0》:介绍52个编写高质量IOS与OS X代码的方法;