#Swift 解析 Xml及webkit(二)
使用假資料呈現做完了,表示我們的collectionView可以正確顯示資料,所以可以開始來寫如何解析xml格式的資料
- 下載資料
下載資料的方式可以用data去load資料,先是需要address>url>URLSession>task大概知道方向後可以開始執行程式碼的撰寫
var session = URLSession(configuration: .default)
值得注意的是用URLSession去取得的資料會是預設在共時貯列裡,所以不用再把它寫進diapatchQueue.global().async{}裡面
URL(String:)取得的資料會是一個optional,所以這邊做一個optional binding取直,並可以用dataTask的方法去下載取得資料,最後再處理resume()
這個方法handler裡面要放的是一個closure,分別處理三個參數回傳一個空的,裡面先去判斷error的狀況,有可能是沒有網路的狀況,沒有網路的話這裡的error回得到一個非nil的狀態
接下來再處理data的部分,一樣做個optional binding確保得到的直不是nil,然後裡面再去做xml的資料解析,將資料load完後因為顯示在螢幕上跟畫面有關係,所以用主貯列去顯示資料,裡面用collectionview取reloadData就好
不過在此之前先來做如何解析xml
2. 解析xml的delegate
xml是什麼,其實看到他還真的不陌生,這種標籤語言,以前大學寫過php做過網站,一定會使用到html,差別只在於一個主要用於網站一個則是資料傳輸,都是用標籤把資料結構化的語言。
這次練習的目標是用apple的itunes提供的rss服務
要解析xml的資料需要用到的方法
因為需要將需要的資料取下來並結構化,先在專案裡開啟一個新的檔案,選擇.swift的檔案。
我們新建一個檔案用來專門解析load下來的xml資料,裡面自己定義class,因為是自行定義一個protocol,而這個class一定要去繼承NSObject,因為 iOS SDK 內建類別都繼承自 NSObject。
裡面我們可以去實作下面幾種方法
<title>iTunes Store: Top Songs</title>
以上面這段資料為例,<title>是開始標籤,</title>為結束標籤,裡面的Character就是字元內容。
當程式讀取到開始標籤會執行didstartElement,讀到結束標籤會執行didEndElement,再來foundCharacters則是讀取到裡面的字元時會執行的。
根據我自己要從xml擷取的資料,我需要<entry><title><id><im:image>這些標籤裡的資料,在上面提到的三個方法裡去做if判斷分別將資料存到陣列裡
在三個方法裡寫好判斷後,最後再寫一個方法把所有存完所有結果的資料存進陣列裡回傳出來
如此一來回到原本的檔案,就可以在下載的function裏利用delegate的方式parser 這些資料
這樣做完就可以成功把資料load下來了,記得回去再cellForItemAt的方法裡將取得的資料告訴它每一個需要呈現什麼資料。
這邊也是莫名的卡很久,當初也不知道腦袋在打什麼結,回傳過來的照片連結因為是字串,所以後來乾脆在寫個方法把object[indexPath.row].imageLink得到的資料下載成照片顯示出來
以上大概只是寫一些主要的方式及資料下載的方式,實際上還是有許多細節跟思考的地方,比如說要如何解析xml資料當初也是卡很久,如何將資料結構化存取下來,也是看了許多資料,才成功的,大致功能約莫是如此。
上班族一邊進修一邊工作好累…不過這樣的生活好像過的意外地充實呢
期待有能力離開目前公司的那天,每次打完文章都會有種激昂熱血的感覺呢XD