作業#58 Apple Music Taiwan Top50
目的:練習解析JSON並自訂資料型別,串接API顯示資料
練習串接Apple Music的API得到台灣Top50的排行榜,用TableView顯示結果點擊Cell後顯示每首歌在Apple Music的畫面
取得API
先點擊下方連結
點擊後會出現下方的畫面,從下面可以點擊想要取得API類型,有很多不同的可以選擇音樂、App、Podcasts…等,還可以選擇不同國家的榜單還能選擇資料數量最多50個,選擇完會有網址出現在上方
將URL複製後貼上Postman,他可以幫我們排版好比較好閱讀格式
解析JSON自訂資料型別
一層一層解析JSON找尋我們需要的資料
我們需要的資料都在results裡面,這個results是個Array,每首歌是一筆資料
artistName:歌手或團體名稱
name:歌曲名稱
releaseDate:歌曲發行日期
artworkUrl100:歌曲封面照100*100
url:這首歌在AppleMusic的網址
Storyboard
榜單
- 尺寸100*100,Aspect Ratio 1:1的歌曲封面圖片
- 用StackView把三個顯示資訊的Label用StackView包起來
- 最右邊放一個UIImageView顯示system的image,用來顯示排名
Apple Music網頁
- 用WebKit View顯示該首歌在Apple Music的網頁
- 用UIActivityIndicator呈現loading動畫
抓資料、抓圖(URLSession)
- 先聲明一個空陣列裝自訂的資料型別,要裝從API取得的資料
- 把API的網址放進去URL用guard let取得,因為URL是optional
- 用URLSession.shared.dataTask下載,會有(data response error),data可以取得下載下來的資料,這邊我們先不考慮error假設網路什麼的都很順利
- 用optionalBinding打開data,然後用JSONDecoder()進行解碼,我們這邊下載下來的data是Data型別而且是JSON格式,所以要解碼然後.decode要放入我們自訂的資料型別,解碼出來就會取得符合我們自訂型別的資料
- 解碼後放入我們聲明的空陣列中,然後下載完成後在main thread去更新tableView,因為更新tableView是畫面的事情所以要在main thread去執行
- 把資料抓下來後我們就有了每首歌圖片的URL
- 參數帶入每首歌的URL用URLSession去下載,然後取得data後希望function結束後還能使用這個data所以加入@escaping
TableViewCell
自訂TableViewCell類別,將元件的@IBOutlet連結進去,然後在awakeFromNib去初始圖片ImageView圓角
TableViewController
viewDidLoad
畫面一讀完就開始抓資料
TableViewDataSource
numberOfRowsInSection: 因為dataSource在畫面一讀入就開始了所以這時資料還沒下載完,所以先檢查裝資料的Array有沒有資料,再決定顯示幾格
cellForRowAt:一樣先檢查資料是否下載好了,還沒下載好的話在唯一顯示的cell內顯示Loading…,然後allowsSelection等於false,資料如果還沒載好不能點擊cell,如果下載好了就顯示資料和下載圖片
傳遞Apple Music的網址到下一頁
- 聲明一個optionalString裝傳遞的網址
- 用shouldPerformSegue去判斷,使用者有沒有點擊,有點擊cell上面的變數才會有值,如果沒值不能切換頁面
用@IBSegueAction傳值
TableView更新動畫
- 先重新讀入tableView
- 取得每個顯示在畫面上的cell,然後用迴圈把每個顯示在畫面cell移動到畫面外
- 接著再用迴圈以及UIViewPropertyAnimator把每個cell用動畫歸位
WebKit View
在要顯示網頁的ViewController聲明一個變數接收網址
- 在viewDidLoad把接收的網址帶入URLRequest,然後再給WebKit View
- 將WebKit View的navigationDelegate設定ViewController
- 在類別後加上WKNavigationDelegate
class WebViewController: UIViewController,WKNavigationDelegate
網頁讀完就關掉ActivityIndicator的動畫
操作畫面
參考連結:
GitHub連結: