[Swift]Music App #4 iTune API, Model(MVC), @escaping

Music app的version 2把音樂播放器的部分接上了iTune的API,如此一來音樂的來源就由原本存放在App中的音樂變成iTune。

此外為了讓程式更簡潔、容易維護,也將原本寫在view controller中抓API資料的function移到了MVC架構的model中。

iTune API

Apple官方提供的iTune Search API非常平易近人,資料架構簡明,清楚說明parameter key代表什麼、value可以放入什麼樣的值來獲取我們需要的資料。在解析過Instagram複雜的JSON資料後,iTune根本是一塊小蛋糕!

利用以下官方提供的API URL:

https://itunes.apple.com/search?parameterkeyvalue

想要得到的資料為Taylor Swift的歌曲,因此欲取得的media為music,term則是想要搜尋的關鍵字taylor+swift。term的values欄位有說明,空格應用加號(+)來替代。

透過Postman測試:

順利取得了所需的資料。

接著就是找出以下所需要的資料藏在哪個key value pair,就可以透過自訂的型別抓取出來使用。

歌手名稱、專輯名稱、歌曲名稱、音樂播放連結、發行時間、專輯圖片

自訂型別SongResults & SongType

可以看出從iTune得到的資料很簡單,key results中的value是一個array,array中有50個dictionary,每一個dictionary裝的是一首歌的所有資料,有30個key-value pair,前面提到所需要的資料,就藏在這裏面。

抓取資料

之前都把抓取資料的function寫在view controller裡面,但像這個App在playlist VC和點擊曲名後播放音樂的music VC都需要用到相同的抓取資料function來獲得iTune的資料,因此我把這部分的function都寫到了model裡面,如此一來就可以在不同的view controller中重複利用,也讓App更容易維護。

另外API所得到的專輯圖片最大只有100x100,為了讓它們能夠美美地顯示在App上,我希望可以有1000x1000的大小。所以取得資料時設定它的資料型別為String,並用replacingOccurrences來處理,處理後的url就可以得到1000x1000的圖片。

@escaping

因為不希望自己寫出自己也不知道為何而寫的code,在這裡花了許多時間來釐清function、closure、@escaping之間的愛恨糾葛(see reference)。

@escaping可以讓傳入completion的function在function fetchImage這個執行完畢後還能繼續使用。因為URLSession的關係,這裡需要使用@escaping。

References:

Write Download Data Function in Model (MVC)

Closure & @escaping

iTune API

--

--

Penny Ng
彼得潘的 Swift iOS / Flutter App 開發教室

A passionate self-taught  iOS developer. Write to record my learning and share the knowledge