重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
第一步:编程入门课
成都创新互联公司的客户来自各行各业,为了共同目标,我们在工作上密切配合,从创业型小企业到企事业单位,感谢他们对我们的要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。专业领域包括成都网站设计、网站制作、电商网站开发、微信营销、系统平台开发。
时间预计: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开发者吧!
第一步,学习开发语言Objective-C。参考书看《Objective-C基础教程》这本书就行了。书看到后来还需要补充一些关于面向对象的知识,一般计算机专业的学生都是在学C 的时候接触这类思想的。我推荐的那本参考书里也会有一些讲解,进阶的学习需要以后再去看资料,没有特定教材,因为面向对象是一种编程思想,好在Objective-C本身就是这种思想的体现,以后写代码的时候可以慢慢体会。学完《Objective-C基础教程》,就会对iOS开发中所用到的基础数据类有一个了解了,这时候应该就可以写简单的无界面程序了。第二步,学习iOS开发的软件运行原理,软件开发思想、规范以及一些苹果公司提供的常用标准UI(User Interface,用户界面)控件的使用方法。这个阶段推荐的参考书是《iPhone 4与iPad开发基础教程》,该书有中文译本,虽然不是最新的iOS教程(最新的教程应该是iOS7开发基础教程,但是该书没有中文译本,如果英文过硬,看这本书当然最好)。第三步,熟悉常用第三方控件。因为苹果本身开放性的局限,其提供的标准开发库会有一些功能局限,智慧无线的网友们开发了各种各样的第三方控件来实现他们想要的功能,可以使开发过程事半功倍。此部分为进阶学习内容,需要在掌握前两步内容的基础上。这一步主要是试用,学习第三方代码,要求阅读第三方开发文档以及代码多一些。可以与开发同时进行,边学变进行软件开发。除了参考书,这里推荐一个网站“Cocoachina苹果开发中文站”里面分享了很多网友的代码,并且可以对自己学习过程中遇到的问题进行讨论。学习初期,中期以及后期进阶都可以在这个论坛找到相应的学习资料与代码,并且可以通过发帖得到大神的技术指点。对应的英文网站是Stackflow,此网站偏重实际开发问题的解决,交流语言为英文。另外,斯坦福大学每年都开设iOS开发的公开课,从Objective-C的学习到最后的控件使用以及开发思想,架构的学习,都有涉猎,是很好的视频教程。网易公开课中有以往课程配中文字幕的视频,而最新的课程一般没有中文字幕,并且,该课程选择默认学生已经有C 编程基础,可能对于初学者会困难一些。视频属于公开资源,在搜索引擎上搜索斯坦福、iOS等关键字,即可找到相应资源。刚刚简单搜索了一下,优酷已经提供iOS7开发的高清视频专辑。最后,无论学习哪个操作系统的软件开发,最关键还是要多多练习,因此大量的写练习代码,看别人的优秀代码很重要。
如果要研究OpenGL ES相关和 GPU 相关,这篇文章很具有参考的入门价值.
首先要从 Runloop 开始说,iOS 的 MainRunloop 是一个60fps 的回调,也就是说16.7ms(毫秒)会绘制一次屏幕,这个时间段内要完成:
这些 CPU 的工作.
然后将这个缓冲区交给 GPU 渲染, 这个过程又包含:
最终现实在屏幕上.因此,如果在16.7ms 内完不成这些操作, eg: CPU做了太多的工作, 或者 view 层次过于多,图片过于大,导致 GPU 压力太大,就会导致"卡"的现象,也就是 丢帧 , 掉帧 .
苹果官方给出的最佳帧率是: 60fps (60Hz),也就是一帧不丢, 当然这是理想中的绝佳体验.
一般来说如果帧率达到 60+fps (fps = 60帧以上,如果帧率fps 50,人眼就基本感觉不到卡顿了,因此,如果你能让你的 iOS 程序 稳定 保持在 60fps 已经很不错了, 注释,是"稳定"在60fps,而不是, 10fps , 40fps , 20fps 这样的跳动,如果帧频不稳就会有卡的感觉, 60fps 真的很难达到, 尤其是在 iPhone 4/4s等 32bit 位机上,不过现在苹果已经全面放弃32位,支持最低64位会好很多.
总的来说, UIView从绘制到Render的过程有如下几步:
UIView 的绘制和渲染是两个过程:
上面提到的从 CPU 到 GPU 的过程可用下图表示:
下面具体来讨论下这个过程
假设我们创建一个 UILabel
这个时候不会发生任何操作, 由于 UILabel 重写了 drawRect 方法,因此,这个 View 会被 marked as "dirty" :
类似这个样子:
然后一个新的 Runloop 到来,上面说道在这个 Runloop 中需要将界面渲染上去,对于 UIKit 的渲染,Apple用的是它的 Core Animation 。 做法是在Runloop开始的时候调用:
在 Runloop 结束的时候调用
在 begin 和 commit 之间做的事情是将 view 增加到 view hierarchy 中,这个时候也不会发生任何绘制的操作。 当 [CATransaction commit] 执行完后, CPU 开始绘制这个 view :
首先 CPU 会为 layer 分配一块内存用来绘制 bitmap ,叫做 backing store
创建指向这块 bitmap 缓冲区的指针,叫做 CGContextRef
通过 Core Graphic 的 api ,也叫 Quartz2D ,绘制 bitmap
将 layer 的 content 指向生成的 bitmap
清空 dirty flag 标记
这样 CPU 的绘制基本上就完成了.
通过 time profiler 可以完整的看到个过程:
假如某个时刻修改了 label 的 text :
由于内容变了, layer 的 content 的 bitmap 的尺寸也要变化,因此这个时候当新的 Runloop 到来时, CPU 要为 layer 重新创建一个 backing store ,重新绘制 bitmap .
CPU 这一块最耗时的地方往往在 Core Graphic 的绘制上,关于 Core Graphic 的性能优化是另一个话题了,又会牵扯到很多东西,就不在这里讨论了.
GPU bound:
CPU 完成了它的任务:将 view 变成了 bitmap ,然后就是 GPU 的工作了, GPU 处理的单位是 Texture .
基本上我们控制 GPU 都是通过 OpenGL 来完成的,但是从 bitmap 到 Texture 之间需要一座桥梁, Core Animation 正好充当了这个角色:
Core Animation 对 OpenGL 的 api 有一层封装,当我们要渲染的 layer 已经有了 bitmap content 的时候,这个 content 一般来说是一个 CGImageRef , CoreAnimation 会创建一个 OpenGL 的 Texture 并将 CGImageRef(bitmap) 和这个 Texture 绑定,通过 TextureID 来标识。
这个对应关系建立起来之后,剩下的任务就是 GPU 如何将 Texture 渲染到屏幕上了。 GPU 大致的工作模式如下:
整个过程也就是一件事:
CPU 将准备好的 bitmap 放到 RAM 里, GPU 去搬这快内存到 VRAM 中处理。 而这个过程 GPU 所能承受的极限大概在16.7ms完成一帧的处理,所以最开始提到的60fps其实就是GPU能处理的最高频率.
因此, GPU 的挑战有两个:
这两个中瓶颈基本在第二点上。渲染 Texture 基本要处理这么几个问题:
Compositing 是指将多个纹理拼到一起的过程,对应 UIKit ,是指处理多个 view 合到一起的情况,如:
如果 view 之间没有叠加,那么 GPU 只需要做普通渲染即可.
如果多个 view 之间有叠加部分, GPU 需要做 blending .
加入两个 view 大小相同,一个叠加在另一个上面,那么计算公式如下:
R = S + D *( 1 - Sa )
其中 S , D 都已经 pre-multiplied 各自的 alpha 值。
Sa 代表 Texture 的 alpha 值。
假如 Top Texture (上层 view )的 alpha 值为 1 ,即不透明。那么它会遮住下层的 Texture .
即, R = S 。是合理的。
假如 Top Texture (上层 view )的 alpha 值为 0.5 ,
S 为 (1,0,0) ,乘以 alpha 后为 (0.5,0,0) 。
D 为 (0,0,1) 。
得到的 R 为 (0.5,0,0.5) 。
基本上每个像素点都需要这么计算一次。
因此, view 的层级很复杂,或者 view 都是半透明的( alpha 值不为 1 )都会带来 GPU 额外的计算工作。
这个问题,主要是处理 image 带来的,假如内存里有一张 400x400 的图片,要放到 100x100 的 imageview 里,如果不做任何处理,直接丢进去,问题就大了,这意味着, GPU 需要对大图进行缩放到小的区域显示,需要做像素点的 sampling ,这种 smapling 的代价很高,又需要兼顾 pixel alignment 。 计算量会飙升。
如果我们对 layer 做这样的操作:
会产生 offscreen rendering ,它带来的最大的问题是,当渲染这样的 layer 的时候,需要额外开辟内存,绘制好 radius,mask ,然后再将绘制好的 bitmap 重新赋值给 layer 。
因此继续性能的考虑, Quartz 提供了优化的 api :
简单的说,这是一种 cache 机制。
同样 GPU 的性能也可以通过 instrument 去衡量:
红色代表 GPU 需要做额外的工作来渲染 View ,绿色代表 GPU 无需做额外的工作来处理 bitmap 。
全文完
收录: 原文地址
oc已全部翻译完成视频总4个视频免费下载
链接:
提取码:64s9
oc已全部翻译完成视频 总4个视频|OC教程04:速建+讲解.mp4|OC教程03:如何给机器人添加纹理与着色.mp4|OC教程02:场景管理.mp4|OC教程01:涂鸦的投射原理与应用.mp4
这篇文章主要介绍了实际应用 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 的初始化函数。