iOS,破冰!

來源:互聯網
上載者:User

標籤:

首發:個人部落格,更新&錯誤修正&回複

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,破冰!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.