首发:个人博客,更新&纠错&回复

iOS,破冰!

今年学的技术,以iOS自学为成本最高昂:花几千块买了台mac mini电脑,又前后买了6本书籍,从头到尾是30天时间,当然,这30天里穿插了dota、生病、出行、读《布局天下》、楚汉历史、《基督山伯爵》,这样算来,花费的时间倒不多。但到现在才达到“破冰”的地步,可见是很艰难的。
全新的操作系统,全新的语言(c,obj-c,swift),全新的ide:结构,热键,调试方式都与用惯了的eclipse不同。所以学ios和学android比,难度大了不少,而且不是技术含量的难度,而是外围的问题需要解决,这就让人很压抑和憋气,例如下载xcode,刚好是在xcode爆出病毒的时候,国内网盘下载全都无效,从官网下载却经常莫名其妙地中断,并且不能继续。而之前为了学iOS花200多块(笑)买的iphone4,又不能用于调试,因为xcode支持的最低版本是iphone4s。书籍的源码,又常常因为xcode更新太快而不能使用。这些事情都很荒唐又无谓,但很耽误事情和影响心情——尤其是对于没有收入、需要跟老妈借钱的人来说。
好在这些问题都过去了,或者说习惯了。书籍的选择,最后最满意的还是关东升的《iOS开发指南》,这种培训班级别的书籍或许会被人鄙视,但对于“想快速学一本新语言”的人来说,它讲的都是必备的东西。换句话说,这本书最契合我当时的“知识起点”和“知识终点”:我已经会的东西,它都不讲;我暂时不需要会的东西,它也不讲;讲的都是我不会又需要会的知识。
在这本书之前读的《iOS8应用开发入门经典》,我的评价是:有用的东西讲了不少,但最让人感觉爽快的点都没讲。比如讲数据存储,它既不讲本地数据库的存储,也不讲远程rest交互,这就让人感觉好不痛快。而且,在最前面压抑了好几章不写helloworld,先讲预备知识,这虽然让人感觉冷静稳健,但毕竟憋得慌。
至于再之前读的《objective-c编程》和《iOS编程》这两本书,在决定用纯swift编程后,有点后悔花时间读这俩书了,但有的书的意义不在于对你有帮助,而在于消灭你的不安,例如读了《objective-c编程》
之后,至少在不得不接触objective-c代码的时候,不用过于因陌生而恐惧。至于《iOS编程》,个人很不喜欢,因为作者的存在感过强了,他不是根据读者的需要谋篇布局,而是以自己的意识流为线索,这显得很自以为是、自说自话。
另外两本《iOS开发进阶》和《Swifter》,是国内大牛写的,目前我的阶段还用不上,也没法评价好坏,只能说入门阶段不用急着买。对这两本书的评价等我再学得深入点儿再进行。
 
入门时候需要的其实很简单:
1)ide的基本操作,例如怎样新建一个项目,怎样调试它,怎样新建一个类,怎样使用新建的类等等。
2)单界面功能的实现,包括把控件绑定到controller的属性上,控件被触发时调用controller的方法。这两点iOS的开发环境直接提供了解决方案,通过拖拽就能实现绑定。这就使得例如“有一个输入框和一个按钮,当点击按钮时将按钮文字设为输入框的文字”这样的功能容易实现。
实际有界面的程序都有这个需求,即程序要有个变量保持控件,控件被触发时调用程序中定义的某个方法,方法体里可以通过保持控件的那个变量对控件属性进行变化。例如网页中的——
var $btn = $(“#theBtn”);
$btn.click(function(){
    $btn.text("xx");
});
或者android中的在初始化activity时,通过findViewById获得控件,强制转型后赋给该activity的实例属性,再指定该控件触发时的回调函数(使用匿名内部类),该函数内部使用保存控件对象的实例属性来改变控件的属性。这些手工操作很讨厌,所以有的ioc框架实现了注解方式指定“控件绑定”和“触发回调”。
“控件绑定”和“触发回调”,在iOS中现在是自带的功能了,“界面”和"controller类"的对应关系,也被强制规定了。在网页中的mvvm框架的使用时,"某个页面片段"与"某个js对象"的对应是约定的,但理论上网页还是可以使用基本js方式进行功能实现,这就有了代码混乱的危险。iOS通过强制规定的方式,一了百了地消除了这个危险。
“约定”成为“规定”,这不是剥夺程序员的自由权利,因为“约定”已是久经检验的最佳实践,在此之外的“自由”是散漫无理、毫无意义的。
3)从单界面到多界面,在网页中,程序中控制界面跳转是request.getRequestDispatcher.forward之类的方法,在android中,则是使用intent,要传递的数据在intent中赋值,在目标activity中从intent中取值,这类似servlet中的request.setAttribute。到了iOS中,打开一个新界面与android类似,也是创建一个新的界面对象并将其压入栈顶,到要关闭这个界面时将这个对象出栈。但是传值的需求由于没有intent这个载体,只能将值直接赋予目标controller的属性。就是说,相比android,iOS的界面初始化函数,获取传来的参数,不再是从“方法入参”中获取,而是从“实例变量”中获取,这有点像java web中spring mvc框架和struts2框架的区别,个人感觉iOS的做法(和struts2一样)是不合适的。
参数从入参中取得,是天经地义的,实例变量不该是放置参数的地方。
除了这种手动跳转、新界面入栈的方式之外,iOS还将常见的其他多场景关系做了自带实现,如tab选项卡、nav导航方式的跳转,这种预设类似“语法糖”,没它也可以,但有它就方便许多。将“经过实践证明确实需要的”功能作为基础库的一部分提供,是所有语言进步的当然方式,就像json等库成为android基础库的一部分一样。
4)连接到数据源。与html5和android一样,iOS也可以与本地的sqlite数据库交互,这种“本地持久化”的需求当然是广泛存在的。同时,还有些需求,不需要关系型数据库这样沉重的方式,只需要以键值对的方式存储,这在html5(5之前就是cookie的用武之地)、android、iOS当然也都提供了支持。这两种支持就像服务器端开发提供关系型数据库和nosql数据库一样,各有各的用处。
除了本地持久化,与服务器的交互当然也是必不可少的,交互方式rest还是最流行的。android和iOS提供的方案都很好用,反而是天经地义使用json的网页存在个跨域的问题,这是个挺搞笑的事情:我提供一个rest接口,谁的客户端都可以使用,我自己网站的js也可以访问,但别人网站的js不行——他们如果想访问,就要解决跨域问题。
 
以上四点解决了,可以说”iOS已经破冰了“,实际它们对应的还是servlet/jdbc/ajax三个技术,即表现层问题、持久层问题、异构系统交互问题这三大问题,任何技术,把这三个问题解决了,其他的都是“锦上添花”的问题。
但为了解决这几个问题,足足花了我一个月的时间!这既有熟悉新语言、新环境的成本,也有iOS和swift演进太快,书籍和网络资料容易过时的原因。
那么,从明天开始,开始开发“思而勤工作室”的ios版客户端,就像开发“思而勤工作室”的android客户端一样,我希望当它开发完毕之后,能对iOS开发更有信心。

iOS,破冰!的更多相关文章

  1. WP8微信5.3开始内测 支持Cortana语音 两微破冰了?

    WP版微信v5.3内测版昨发布了,进行了一些小幅升级,最意外的是原生支持WP8.1版Cortana语音命令操作.要知道微软的聊天机器人“小冰”在微信上存在不到4天,就被微信全面封杀退出,现在微信又内测 ...

  2. IOS Swift语言开发 tableView的重用以及自cell的自适应高度

    http://www.aichengxu.com/iOS/11143168.htm 一.准备数据 (这是一个元组,第一个元素为英雄的名字;第二个元素为英雄头像图片的名字,格式为.PNG,如果为其他的格 ...

  3. iOS开发如何面对疫情过后的面试高峰期 !

    2020年本应该是一个 "爱你.爱你"的年份!却因为 黑天鹅 给我们带来非常大的影响! 一.2020年iOS招聘数据分析 这里是 2020年3月份BOSS直聘 北京iOS招聘前几页 ...

  4. iOS可视化动态绘制连通图

    上篇博客<iOS可视化动态绘制八种排序过程>可视化了一下一些排序的过程,本篇博客就来聊聊图的东西.在之前的博客中详细的讲过图的相关内容,比如<图的物理存储结构与深搜.广搜>.当 ...

  5. 【疯狂造轮子-iOS】JSON转Model系列之二

    [疯狂造轮子-iOS]JSON转Model系列之二 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇<[疯狂造轮子-iOS]JSON转Model系列之一> ...

  6. 【疯狂造轮子-iOS】JSON转Model系列之一

    [疯狂造轮子-iOS]JSON转Model系列之一 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 之前一直看别人的源码,虽然对自己提升比较大,但毕竟不是自己写的,很容易遗 ...

  7. iOS总结_UI层自我复习总结

    UI层复习笔记 在main文件中,UIApplicationMain函数一共做了三件事 根据第三个参数创建了一个应用程序对象 默认写nil,即创建的是UIApplication类型的对象,此对象看成是 ...

  8. iOS代码规范(OC和Swift)

    下面说下iOS的代码规范问题,如果大家觉得还不错,可以直接用到项目中,有不同意见 可以在下面讨论下. 相信很多人工作中最烦的就是代码不规范,命名不规范,曾经见过一个VC里有3个按钮被命名为button ...

  9. JS调用Android、Ios原生控件

    在上一篇博客中已经和大家聊了,关于JS与Android.Ios原生控件之间相互通信的详细代码实现,今天我们一起聊一下JS调用Android.Ios通信的相同点和不同点,以便帮助我们在进行混合式开发时, ...

随机推荐

  1. leetcode算法

    Given a linked list, return the node where the cycle begins. If there is no cycle, returnnull. Follo ...

  2. LogBack配置详解(一)

    一:根节点<configuration>包含的属性: scan: 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true. scanPeriod: 设置监测配置文 ...

  3. CSS布局一

    CSS布局一 实例一(居中) div#container{ width:960px; height:650px; margin:0 auto; border:1px solid #ccc; /*就是说 ...

  4. Apple Developer Program Roles Overview

    Apple Developer Program Roles Overview There are three roles that can be assigned to Apple Developer ...

  5. POJ 1041问题描述

    Description Little Johnny has got a new car. He decided to drive around the town to visit his friend ...

  6. Android 自定义控件之app标题栏的封装

    在app的开发中,每一个页面都有上面的标题栏,总不能在开发的过程中没个界面都写一个标题栏的布局,所以为了开发的方便,将该标题栏进行的封装,以后在实际的开发工作中,也可以将该封装好的标题栏控件直接拿来使 ...

  7. 在Hyper-V的虚拟机中使用无线网络

    今天在WINDOWS 8.1中装了WINDOWS 7的虚拟机,但默认情况下只能共享有线网络,而没有无线网络. 解决方法: http://www.elmajdal.net/Win2k8/Enabling ...

  8. lua对模块接口扩展的一种方法

    module lua中模块的实现,对于使用者来说就是一个库,引用此库后,可以调用库中实现的任意函数. 使用库,可以将一类功能相关的接口做封装,并提供开放接口. 参考: http://blog.codi ...

  9. Dive into python 实例学python (2) —— 自省,apihelper

    apihelper.py def info(object, spacing=10, collapse=1): """Print methods and doc strin ...

  10. wampserver2.6下UCenter1.6.0与UCenter Home2.0整合安装

    上一篇文章,我们已经安装了,ucenter1.6.0,所以此文介绍独立安装ucenter1.6.0与ucenter home2.0的整合安装. 1,)从官网下载UCenter_Home_2.0_SC_ ...