『約翰紅茶公司訂飲料app』2.1

利用DELETE、PUT,刪除修改網路資料

--

新增、下載、修改、刪除(剛好錄完這個gif API又爆了 😆)

修改網路資料是我覺得其中最困難的地方!幾乎把所有網路上的檔案和文章都下載過也看過了,可能是理解力太愚鈍,耗了好多體力跟腦力,寫爆了好幾個免費api 。

因為有同學和peter的熱心幫忙解答我的所有疑問才有辦法真正的理解並且寫出來!

修改網路資料

結構圖更新版,與上一篇不同的地方在於訂購飲料頁面跟修改資料頁面分為兩頁。

  • 參數的意義:這裡的參數是指新的訂單資料,如果有更新他會直接覆蓋原本的訂單資料。
  • 連結字串要加上 .addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) 來處理中文編碼問題
  • 最重要的就是 let orderTOUpload = OrderTOUPload(data:[order])orderToUpload就是代表要編碼上傳成新的資料的data
  • 修改httpMethodPUT
  • 檢查回傳結果的字串爲 update
  • 再來就是設定新的訂購資料,最後寫入PUT修改上傳資料的function。
  • update(order:newData)這邊傳進去的參數就是新的訂購資料。

最後把keepData()寫進確認修改的button中,就算不把keepData()寫成function也沒關係,直接寫入這邊也是OK的~

刪除資料

sheetDB 的刪除API:

從API的描述,後端會根據連結最後面的加上/{column}/{value} 去找到對應的資料,然後刪除整筆;如果有多筆符合,就會刪除所有符合的資料。

  • 參數的意義:這裡選擇使用 name來當參數,如果用飲料名稱當參數,會刪掉點了同樣飲料的所有人的訂單,這邊假設一個人只有一筆訂單 ; completionHandler則是加上@escaping(能夠在這個function外也能執行),不過這邊應該是寫與不寫都可以。
  • 連結字串要加上 .addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) 來處理中文編碼問題
  • 修改httpMethodDELETE
  • 檢查回傳結果的字串爲 deleted

Delete和Post一樣是使用上傳 uploadTask

下圖是網路上查到的說明dataTask和uploadTask、downloadTask的差異!

向左滑動刪除資料

使用 tableView(_:commit:forRowAt:) 實作滑動刪除的效果:

在Xcode中打commit就會出現這個function了!

  • 在刪除時通常會加Alert來確認是否要刪除,避免誤刪,按下ok會進行刪除的動作。
  • 將sheetDB的刪除function寫在OK的closure中,參數名的name就是訂購者名order.name。
  • 刪除後將reloadData寫在mainthread中才會馬上更新更新杯數跟價格!

錯誤寫法 ⚠️⚠️⚠️

想記錄一下自己犯錯的地方

一開始遇到兩個棘手的問題,表格會一直無限新增訂單、傳資料到編輯頁面時要修改時飲料名稱跟價格也會跑掉,都是因為reloadData沒有寫好的關係。

  • 把更新飲料價錢的function寫在下載的飲料菜單內,導致會一直更新,所以傳資料到編輯頁面要修改飲料名稱跟價格會跑掉。
  • 無限新增重複訂單則是因為這個迴圈會一直fetch到網路上的資料所以一直去新增。

解決辦法:

加入 downloadData.removeAll()把原本下載的資料全部清空,這樣每次下載就只會下載一次不會重複fetch,也會顯示最新的資料。

在透過DELETE刪除時其實不需要使用到參數型別,也不需要編碼上傳東西所以才會有黃色警示data是沒有東西的。雖然這樣寫還是可以執行可是有可能會影響到其他功能!

  • 我這邊的錯誤就表示解碼失敗型別有問題。
  • 如果有錯誤回傳的字典是[String:String],只有一個key叫error。
  • 這個錯誤是表示ap爆了XD

希望自己之後能夠了解清晰在寫程式邏輯會更加正確錯誤率也會更低。

--

--