串接政府開放平台API-國際重要疫情資訊

Demo

https://data.gov.tw/dataset/10568

在政府開放平台看到國際重要疫情API,試試看串接看看。

第一頁會看到世界各地疫情資訊(下拉更新做更新的動作),還有爆發時間;點進去是詳細描述。

網址頁面點進去看到Json下載,看一下結構第一個dictionary。

Json載起來!
[{"sent":"2020-08-21T11:29:30+08:00","Source":"CDC","effective":"2020-08-21T11:29:30+08:00","expires":"2020-11-21T11:29:30+08:00","senderName":"疾病管制署","headline":"美國-西尼羅熱","description":"美國康乃狄克州衛生部公布該州今年首例,為當地居民,病例年齡介於40-49歲之間,於7月中發病,已逐漸康復。當局表示目前天氣條件有利於病媒蚊傳播,呼籲應著適當衣物,避免被蚊蟲叮咬。該州最早自1999年出現疫情,截至去年累計158例,其中4例死亡。","instruction":null,"web":"https://www.cdc.gov.tw/TravelEpidemic/Detail/G3PSay_dafdAwjsYNm3CCA?epidemicId=IxLhrZ0xQjVoGy4nvvxX5g","alert_title":"國際重要疫情資訊","severity_level":null,"alert_disease":"西尼羅熱","areaDesc":"美國","areaDesc_EN":"USA","circle":"38.82,-100.54","ISO3166":"US","areaDetail":null,"ISO3166_2":null},
Json Editor Online轉換後

接著回到專案,取得以下的資料。

struct Epidemic: Codable {
var headline: String
var effective: Date
var description: String
}

在打開第一個畫面的TableView(EpidemicTableViewController)解碼上述資料,用Segue傳到下一頁顯示。

let urlStr = "https://www.cdc.gov.tw/TravelEpidemic/ExportJSON"

if let url = URL(string: urlStr) {
URLSession.shared.dataTask(with: url) { (data, response, erroe) in
let decoder = JSONDecoder()//解碼時間
let formatter = DateFormatter()
formatter.dateFormat = "yyyy/MM/dd"
decoder.dateDecodingStrategy = .iso8601
if let data = data {
do {
let epdemics = try decoder.decode([Epidemic].self, from: data)
self.epidemics = epdemics
DispatchQueue.main.async {
self.tableView.reloadData()
}
} catch {
print(error)
}
}
}.resume()

}

時間格式是 2020–08–21T11:29:30+08:00是ISO8601格式,在dataDecodingStrategy後選擇iso8601。

因為Json最外層是Array,可以寫成[Epidemic].self解析整串資料。

顯示資料寫在cellForRowAt。

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "outBreakCell", for: indexPath) as! EpidemicTableViewCell
let epidemic = epidemics[indexPath.row]
cell.titleLabel.text = epidemic.headline

//顯示時間
let formatter = DateFormatter()
formatter.dateFormat = "yyyy/MM/dd"
let dateStr = formatter.string(from: epidemic.effective)
cell.ourbreakDayLabel.text = dateStr
return cell
}

用Segue傳資料到下一頁。

@IBSegueAction func ToDetailPage(_ coder: NSCoder) -> DetailViewController? {
let controller = DetailViewController(coder: coder)
if let row = tableView.indexPathForSelectedRow?.row {
controller?.epidemic = epidemics[row]

}
return controller
}

Activity Indicator

var refreshCon: UIRefreshControl!

往下拉loading圖示會出來在row下面,同步做更新動作。

refreshCon = UIRefreshControl()
refreshCon.addTarget(self, action: #selector(refresh), for: .valueChanged)
tableView.addSubview(refreshCon)

搭配方法。

@objc func refresh() {
tableView.reloadData()
refreshCon.endRefreshing()
}

DetailViewController顯示詳細資訊蠻簡單的,只要呼叫解碼好的description就好,Navigation的title顯示點哪的cell做變化。

title = epidemic.headline
describeLabel.text = epidemic.description

--

--