首發:我的博客,更新&糾錯&回覆html
iOS,破冰!html5
今年學的技術,以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開發更有信心。