iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 2
3
Software Development

Swift零基礎實作旅遊景點app系列 第 2

Swift從零開始-Day2: ViewController Lifecycle與App LifeCycle學習

分類:基本知識學習


1. View Controller可以分成幾種狀態

  • View not loaded
  • View appearing
  • view appeared
  • view disappearing
  • view disappeared

Apple Education. 「App Development with Swift」。 Apple Inc. - Education,2017. iBooks.
配合這些狀態下View的生成或轉換會伴隨著下列方法
a. 僅剛載入時出現一次

  • viewDidLoad:只會出現一次,所以於此方法中一般會寫入背景色、字體大小等,比較無關緊要的事情。
    *b. 隨著畫面的切換,會重複出現的方法,*包含
  • viewWillAppear:載入view之後(接在viewDidLoad後面),在畫面顯示在螢幕之前,此階段的方法適合寫入一些要更新資料的東西,如得到使用者的位置資訊(如果寫在viewDidAppear,可能會造成延遲,使用者已經先看到畫面才更新資料)。
  • viewDidAppear:在畫面顯示在螢幕之後,所以此階段的方法適合寫入一些動畫效果。
  • viewWillDisappear:此方法會在使用者按下back button、switching tabs時觸發,為畫面要準備離開螢幕時的階段,此階段適合寫入一些要儲存的編輯(不寫在viewDidDisappear是因為DidDisappear階段有些元件已經從記憶體釋放了,可能會造成儲存上有風險)。
  • viewDidDisappear : 畫面已經離開螢幕(使用者已經在看新的畫面了),此階段較少用,一般可能用在停止與畫面有關的服務(EX :停止播放),要不然會在畫面離開後仍然持續占著記憶體,影響裝置效率。

2. App LifyCycle

2-1.App的狀態

Apple Education. 「App Development with Swift」。 Apple Inc. - Education,2017. iBooks.

  • Not running狀態:app還沒打開或是已經被終止。
  • Inactive狀態:app正在前台跑但是不接收任何觸控行為(但仍有可能有程式碼在執行),但在這個狀態下的時間極短。
  • Active狀態:在前台運行,且可以接受使用者的觸控行為。
  • Background狀態:app仍在執行程式碼但不顯示於螢幕上。當使用者按下Home,則此app在進入Suspended狀態前會先從active狀態到Background狀態,另外需注意的是於後台狀態下執行的工作越少越好。
  • Suspended狀態:app仍存在於記憶體,但不執行任何code,如果在這個狀態下維持很久,最後會自動釋放記憶體,app回到Not running狀態。

Ex: 當我們按下 app的icon從Not running狀態,進到前台狀態從inactive狀態進入到active狀態,開始使用後就一直維持在active狀態,如果現在剛好有人打電話來接電話,會從active狀態回到inactive再到background狀態,過一段時間(約幾秒鐘)後進入到suspended狀態;當打完電話後會從suspended狀態回到後台回到inactive狀態再回到active狀態。

2-2.對應的方法

a. Did Finish Launching
此方法的階段介在Not running -> Inactive狀態

b. Will Resign Active
此方法的階段約介在要從Active -> Inactive,也就是我們按下Home或是接電話的那一刻。

c. Did Enter Background
此方法的階段緊接在Will Resign Active方法後面,類似介在Background狀態到Suspended狀態,會有約五秒的時間儲存使用者資料,所以會在此方法寫入儲存使用者資料的程式碼。
PS: 注意:如果你的应用程序支持后台运行,那么当用户退出程序时,将不会调用applicationWillTerminate()方法,而是调用applicationDidEnterBackground() 方法。

iOS界面生命周期过程详解 - 乞力马扎罗的雪的博客 - CSDN博客

d. Will Enter Foreground
從後台要準備進入前台的active狀態,如果本來在後台運行,點下icon那刻起要執行的方法。

e. Did Become Active
一般會在Will Enter Foreground之前調用,從inactive -> active狀態。

f. Will Terminate
此方法在程序終止時(要從記憶體釋放時),使用的方法,一般也會在此寫下儲存資料的程式碼。

/Did Enter Background v.s. Will Terminate/
如果今天有些app支援在後台持續運行,例如GPS,播放音樂,會用Did Enter Background方法;如果apps不常在後台運行,那就寫在Will terminate。


上一篇
Swift從零開始-Day1: 學習Swift記憶體管理
下一篇
Swift從零開始-Day3:第三方函式庫CocoaPods與Git, GitHub基本用法學習(1)
系列文
Swift零基礎實作旅遊景點app30

1 則留言

0
shavenking
iT邦新手 5 級 ‧ 2017-12-21 10:09:32

Hi 樓主安安,請問如果在 viewWillAppear 時,去做定位的功能,如果定位太久的話,會影響畫面顯示嗎?

目前測試起來感覺是會有一點點,但不明顯,有時候甚至定位藍點已經出現了,地圖畫面會延遲出現,如果有理解錯誤再麻煩指正了,謝謝啦。

我測試在 viewWillAppear 裡面加入 sleep(5),意思是請 viewWillAppear 先睡覺五秒,就發現畫面卡住,要等他睡醒才會顯示/images/emoticon/emoticon02.gif

我要留言

立即登入留言