Demo

這個天氣API必須申請APPID才能使用,官方沒有明訂免費帳戶的使用次數,但有提到若使用過多的話,會停權並詢問是否要升級使用。

他提供了許多不同模式,包括現在天氣、預報天氣、過去天氣紀錄、UV紀錄、空氣品質資料等等,很多種資料可以抓取。而我這次簡單Demo就以抓取當前天氣為主。

官方建議使用監測站的ID作為查詢依據會比較準確,原因是因為有一筆資料庫專門儲存監測站的資料,其中就是以ID當作PK。

data結構及手動從文件中找出ID

比較麻煩的是,官方提供的ID查詢資料是一筆可以下載的文件,並沒有API可以抓取ID(可能我沒找到?)。因此我得手動從下載的檔案中找出台灣的監測站ID來使用,不過我並沒有使用到台灣的全部資料來Demo。

註:理論上應該是要存成Dictionary,方便地點與ID的查找。

附上Code:

主流程Code

資料中,溫度的單位為凱氏溫度(K),因此需要做換算。
其他資料也需要做一些文字串接來顯示以增加使用者體驗。

背景圖片的使用是根據抓到的Description屬性(字串)來改變圖片。但因為不清楚官方到底有多少種天氣Description,因此若當時天氣的Description超出我考慮的種類,則會出現背景為空白的情況。

其中美麗的圖片切換動畫,我原本是打算用以下方法實作:

美麗的大坑

原本的思考模式是:image為UIImageView的屬性,那麼只要image屬性一改變,就設置的一個淡入淡出的動畫來使用。
這樣只要給我的ImageView建立一個繼承UIImageView的class,並override其中image屬性並設定didset來監聽它即可。

結果這個程式碼根本作用不了!到底哪裡有問題?切換圖片竟然不會觸發「print(“image changed”)」?

為了探索這個問題我花了很多時間嘗試找到合理的答案。目前推論大概是:在初始化(init)時,屬性並不會被didset監聽到。也許和這個有關,還請前輩們指點迷津(跪)。

更新:感謝彼得潘解答,原來真正改變UI的class需要在storyBoard內修改;在Code內修改的話只會改變指定UI的變數型別,不會讓UI元件真正屬於新的class。

後來才使用其他方法完成:

實作切換圖片的動畫方法

更新:感謝@treeman ou,官方有直接提供所有Description種類,可以針對大方向去改變照片即可,就不用一一自己找圖片了。

最後附上GitHub連結:

願意打開我的Code來看,真的十分感謝。
但因為我是OpenWeatherMap API的免費仔,還請善待它,APPID流量爆炸就不能再使用了…

--

--